如何在Java中持续更新键和值都是ArrayList的HashMap
我正在从事一个项目,该项目涉及一些工作的数据集的小组合和关联,并且已经被困了一段时间 我有多组数据,与项目中的其他数据组类似。我有一个组名的数组列表。我将这些相似的组与其他数据集进行比较,描述相似的事情。组的集合,与自己集合中的其他组类似 我一直试图通过以下方法解决这个问题:如何在Java中持续更新键和值都是ArrayList的HashMap,java,arraylist,hashmap,Java,Arraylist,Hashmap,我正在从事一个项目,该项目涉及一些工作的数据集的小组合和关联,并且已经被困了一段时间 我有多组数据,与项目中的其他数据组类似。我有一个组名的数组列表。我将这些相似的组与其他数据集进行比较,描述相似的事情。组的集合,与自己集合中的其他组类似 我一直试图通过以下方法解决这个问题: HashMap<ArrayList<String>, ArrayList<String>> 这有时有效,但似乎只是为了价值,而不是关键 最后,我的目标是用一个标识符重新创建这些数据集,
HashMap<ArrayList<String>, ArrayList<String>>
这有时有效,但似乎只是为了价值,而不是关键
最后,我的目标是用一个标识符重新创建这些数据集,该标识符通过一个新的标识符将这些组连接在一起,而不是它们的当前标识符,该标识符不能以我想要的方式将它们连接在一起
我做错什么了吗?在这个场景中是否有更好的数据结构?HashMap或类似结构是否可行?By key.addgroupToAdd2;密钥已更改,但映射的密钥必须有效且不可变:
将key.addgroups行交换为add2;和map.removesimilarGroupsDataset;要解决此问题或更好,请执行以下操作:
...
for (Entry<ArrayList<String>, ArrayList<String>> entry : map.entrySet()) {
...
map.remove(entry.getKey()); // remove from map before changing the key
entry.getKey().add(groupToAdd2);
entry.getValue().add(groupToAdd);
map.put(entry.getKey(), entry.getValue());
}
如果我从每个数据集中找到另一个组并希望添加到当前
ArrayList这就是我使用ArrayList的原因,它创建了另一个
条目,其中新的键和值与上一个相同,但
在每个ArrayList中添加元素
使用ArrayList作为键。
在映射中,键从其hashCode/equals方法中检索。
因此,当您在此处更改ArrayList键的内容时:
ArrayList<String> value = map.get(similarGroupsDataset);
ArrayList<String> key = similarGroups;
value.add(groupToAdd);
key.add(groupToAdd2); // <-- here
是一个非常糟糕的命名,或者您仅使用组填充地图的关键值
一般的想法是,您不应该在映射中使用hashCode/equals结果可能会在映射中添加键后发生更改的键。
要实现这一目标:
或者在您知道该键将不再被修改时,将该值和ArrayList键一起放置
使用键删除该值,然后使用新键再次添加该值
在任何情况下,为了避免此类错误,您应该为键创建一个不可修改的列表,并将其传递到映射中:
map.put(Collections.unmodifiableList(keys), ...);
在映射中,最好保持键对象不变。 如果更改HashMap中的key对象,并且新的hashCode不同,则该映射已损坏 因此,必须删除旧的密钥对象并插入新的密钥对象 适合您的示例的数据结构将是一个组、数据树,您可以在其中将路径扩展到叶
tree -> (a, 1)
+--> (x, 24)
+--> (b, 2)
+--> (c, 3)
只考虑最终叶的所有路径。
无可否认,还有一点工作要做value.add(groupToAdd);
key.add(groupToAdd2);
map.put(Collections.unmodifiableList(keys), ...);
tree -> (a, 1)
+--> (x, 24)
+--> (b, 2)
+--> (c, 3)