Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 创建HashMap作为标题关键字的索引以提高搜索效率_Java_Search_Arraylist_Hashmap - Fatal编程技术网

Java 创建HashMap作为标题关键字的索引以提高搜索效率

Java 创建HashMap作为标题关键字的索引以提高搜索效率,java,search,arraylist,hashmap,Java,Search,Arraylist,Hashmap,我有一个自定义类Disks,它存储CD的各种信息,如标题、长度、艺术家等。这些Disks对象存储在ArrayList中,该列表只能添加Disks的元素。我正在使用一种基于匹配标题的方法来搜索这些对象。它接受用户输入,然后遍历列表中的每个元素,并比较用户关键字和CD的标题。如果是完全匹配,则将其信息返回给用户 我想通过合并一个HashMap来稍微改变这个搜索机制。我希望标记每个磁盘标题,然后为关键字创建一个映射条目 下面是一个示例:单词“Cars”出现在ArrayList元素的标题中的位置0,5,

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

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

下面是一个示例:单词“Cars”出现在
ArrayList
元素的标题中的位置0,5,7处。我希望能够为“Cars”创建一个映射条目,它将是一个列表[0,5,7]。如果将另一个元素添加到
ArrayList
的位置10,标题中带有“Cars”,我将如何修改旧的映射条目,使新列表为[0,5,7,10]

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

我当前的HashMap声明如下:
public HashMap map=new HashMap()
但是,即使键不同,存储在ArrayList中的值也是相同的,因为只有一个值


我的
磁盘ArrayList
是:
公共ArrayList项
是否有办法将此ArrayList合并到HashMap的值中?

您需要为映射到某个值的每个字符串创建一个新的整数ArrayList。第一次使用条目时,创建一个新列表(必须检查字符串是否映射为null),并将新磁盘条目将存储在Disls的ArrayList中的索引值添加到整数的ArrayList中。每当字符串映射到非空列表时,您只需将索引(它在磁盘ArrayList中的位置)添加到Integer的ArrayList。

老实说,我认为扩展解决方案的最佳方法是使用bloom过滤器或类似的复杂工具。这将需要您创建复杂的哈希代码、管理误报等

话虽如此,基于您的设计,我认为您可以简单地拥有一个哈希映射,指向同样存储在数组列表中的磁盘对象

public HashMap<String, ArrayList<Disks>> map
公共哈希映射
对于关键字“cars”,您有一个磁盘对象列表。对于关键字“loud”,您有另一个磁盘对象列表。只需使用
retainAll()
方法,获取两个列表并找到交点


确保覆盖磁盘中的hashCode()和equals(),以便所有集合都能正常工作。

为“Cars”的索引项添加一个新值

安全方法(key=“Cars”,index=10):


但是,即使键不同,存储在ArrayList中的值也是相同的,因为只有一个值。
您能更具体一点吗?为什么只有索引ArrayList的一个实例?另外,你能告诉我们你是如何把这对夫妇添加到地图上的吗?因为随着可能的键的数量增加,我不需要一个新的索引ArrayList吗?所以这将获取键Cars,然后将10添加到相关的ArrayList?是的,它获取键“Cars”的地图值,这是一个ArrayList,并将10添加到ArrayList。所以如果我有键“Sound”并对位置9执行相同的操作,它会自动将9附加到与“声音”关联的列表中,并将列表单独留给“汽车”吗?是的,如果您参考上面的“安全方式”。这是有道理的,但我将有太多磁盘类的ArrayList需要管理。是的,这是一个缺点。这就是我建议使用bloom过滤器的原因。基本上,您需要为每个磁盘对象计算一个哈希。这种散列表示某些单词的存在或不存在(假设您的关键字有限且数量较少,则更容易理解这种解决方案)。简单地说,单词是“loud”、“car”和“blue”。然后,每个Disks对象将有一个散列码,其值可能在000到111之间。如果您的关键字数大于,那么显然您不能在哈希代码中继续添加位。然后你需要处理假阳性。谢谢你的输入,但我想我会去斯特凡提出的建议,这似乎是简单和更容易管理我的规模。要理解假阳性,请考虑另一个例子。第一位(最低有效位)表示标题中的某个位置有字母“a”。然后“汽车”的第一位将有一个1,但“猫”也会有一个1。这两个单词非常相似,因此哈希代码可能会欺骗您找到假阳性。我认为您的解决方案应该尝试组织这种复杂性。如果这是一个专业项目,我建议使用一个已经实现了这一点的框架,比如Apache Lucene。我喜欢这个答案,但是我如何能够动态地创建这些整数数组列表呢?每次向列表中添加磁盘时,都要标记标题。对于您看到的每个标记,如果Hashmap中已经有一个Arraylist,如果没有(它为null),您将说map.put(disk.title(),new Arraylist());我想我现在已经发现了我的脱节。我没有意识到HashMap可以跟踪新的ArrayList,因为我需要为键创建它们。非常感谢。
map.get("Cars").add(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>>
Set<Integer> resultSet = new HashSet<Integer>();
resultSet.addAll(map.get("Cars"));
resultSet.retainAll(map.get("Loud"));