我有一个自定义类 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/