如何在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)