java - 创建HashMap作为标题关键词的索引,提高搜索效率

标签 java search arraylist hashmap

我有一个自定义类 Disks它存储 CD 的各种信息,例如标题、长度、艺术家等。这些 Disks对象存储在 ArrayList 中其中只能包含 Disks 的元素添加。我正在使用一种方法根据匹配的标题来搜索这些对象。它接受用户输入,然后遍历列表中的每个元素,并将用户关键字与 CD 的标题进行比较。如果完全匹配,则将其信息返回给用户。

我想通过合并 HashMap 来稍微改变这个搜索机制。我希望对每个 Disks 进行标记化标题,然后为关键字创建映射条目。

这里是一个例子:“汽车”一词出现在ArrayList的标题中。位置 0、5、7 处的元素。我希望能够为“Cars”创建一个映射条目,它将是一个列表 [0,5,7]。如果另一个元素被添加到 ArrayList在标题为“Cars”的位置 10 处,我如何修改旧的映射条目,以便新列表为 [0,5,7,10]?

最后我希望用户搜索标题关键字“Loud Cars”。我会首先在索引中找到“loud”以获取[0,7,5]的列表(例如),然后找到“cars”以获取[0,5,7,10]的列表。然后,我将找到这些列表相交的位置并返回 ArrayList对应于这些位置的元素。

我当前的 HashMap 声明如下所示:public HashMap<String, ArrayList<Integer>> map = new HashMap<>();然而,即使 Key 不同,ArrayList 中存储的值也是相同的,因为它们只有一个。

我的Disks ArrayList是:public ArrayList<Disks> items;有没有办法将这个 ArrayList 合并到 HashMap 的 Value 中?

最佳答案

向“Cars”的索引条目添加新值

map.get("Cars").add(10);

安全的方法(键=“汽车”,索引= 10):

ArrayList<Integer> entry = map.get(key);
if (entry == null) {
  entry = new ArrayList<Integer>();
  map.put(key, entry);
}
entry.add(index);

而不是使用

HashMap<String, ArrayList<Integer>>

我推荐

HashMap<String, HashSet<Integer>>

这会自动避免重复。

当您搜索多个单词时,使用retainAll构建多个集合的交集(但复制第一个集合,因为retainAll具有破坏性):

Set<Integer> resultSet = new HashSet<Integer>();
resultSet.addAll(map.get("Cars"));
resultSet.retainAll(map.get("Loud"));

关于java - 创建HashMap作为标题关键词的索引,提高搜索效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19918470/

相关文章:

javascript - 确定我的内容中是否包含搜索词数组的最快方法?

c++ - 在客户的计算机上搜索特定文件

java - 如何从多个ArrayList中找到最大值?

java - 从字符串数组中删除逗号

java - 将自定义命名/ native 查询映射到实体

java - 为什么这个套接字数据只发送一次到 Java 服务器?

MySql 不带全文的复数搜索

java - 如何将对象 ArrayList 中的项目添加到 JList。

java - 将ArrayList添加到另一个ArrayList中

java - 具有自定义光标适配器的 ListView 为空