gpt4 book ai didi

java - 如何在 Java 中持续更新 Key 和 Value 均为 ArrayList 的 HashMap

转载 作者:行者123 更新时间:2023-12-02 12:28:10 27 4
gpt4 key购买 nike

我正在开展一个项目,该项目涉及对某些工作的数据集进行少量组合和关联,并且已经卡住了一段时间。

我有一些数据组,它们与项目中的其他数据组类似。我有一个组名称的数组列表。我将这些相似的组与其他数据集进行比较,描述相似的事物。 (组的集合,与自己集合中的其他组相似)。

我一直在尝试使用以下方法解决这个问题:

HashMap<ArrayList<String>, ArrayList<String>>

事实证明,当找到另一个关系时,添加另一个组(按名称、字符串)非常困难。

如果我从每个数据集中找到另一个组并想要添加到当前的 ArrayList(这就是我使用 ArrayLists 的原因),它会创建另一个条目,其中新的键和值与之前的相同,但添加了每个 ArrayList 中的元素。

这是当前的相关代码:

... 
for(ArrayList<String> similarGroupsDataset : map.keySet()) {
...
ArrayList<String> value = map.get(similarGroupsDataset);
ArrayList<String> key = similarGroups;
value.add(groupToAdd);
key.add(groupToAdd2);
map.remove(similarGroupsDataset);
map.put(key, value);
}

将ArrayList键和Arraylist值存储到变量中,添加新找到的数据,删除旧条目,并添加更新的版本。

由于某种原因,这似乎不会删除没有新添加的找到数据的条目。

所以如果我打印出 map ,它看起来像({1,2},{a,b}) , ({1,2,3},{a,b,c})它应该是什么样子({1,2,3} , {a,b,c}),删除不相关的条目。其中 dataset1 中的 1,2 相似,它们仍然与 dataset2 中的 a,b 相似,等等(如果有意义的话)。

我已经尝试过

map.get(relevantGroupFromDataset2).add(data) 
//adds the newly found similar group to the list of groups
//which are all similar to eachother, from dataset1.

这有时有效,但似乎只适用于值,而不适用于键。

最后,我的目标是使用新标识符将这些组绑定(bind)在一起的标识符来重新制作这些数据集,而不是使用当前标识符,因为当前标识符不能按照我想要的方式将它们绑定(bind)在一起。

我在这里做错了什么吗?在这种情况下有没有更好的数据结构可以使用? HashMap 或类似的结构是可行的方法吗?

最佳答案

If I find another group from each dataset and want to add to a current ArrayList (which is why I am using ArrayLists), it creates another entry, where the new key and value are the same as the previous but with the added element in each ArrayList.

您使用 ArrayList 作为键。
在映射中,键是通过其 hashCode()/equals() 方法检索的。
因此,当您在此处更改 ArrayList 键的内容时:

ArrayList<String> value = map.get(similarGroupsDataset);
ArrayList<String> key = similarGroups;
value.add(groupToAdd);
key.add(groupToAdd2); // <-- here

hashCode()equals() 将不再产生相同的结果。
它被视为 map 的新键。

因此 map.put(key, value); 将添加一个新元素。

<小时/>

为您的实际代码提供一个好的解决方法并不明显,因为 map 执行的逻辑和您期望的内容确实不清楚。
例如:

value.add(groupToAdd);
key.add(groupToAdd2);

要么是一个非常糟糕的命名,要么您仅使用 map 的键值组进行填充。

总体思路是,您不应在映射中使用在将键添加到映射后 hashCode()/equals() 结果可能会发生变化的键。
要实现它:

  • 将值与 ArrayList 键一起放置在您知道该键不会再被修改的时间。

  • 删除该键的值,然后使用新键再次添加该值。

无论如何,为了避免这种错误,您应该为键创建一个不可修改的列表并将其传递到映射中:

map.put(Collections.unmodifiableList(keys), ...);

关于java - 如何在 Java 中持续更新 Key 和 Value 均为 ArrayList 的 HashMap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397525/

27 4 0