我正在尝试使用流行的技术从ArrayLists中删除重复项:
yourList = new ArrayList<String>(new LinkedHashSet<String>(yourList));
它有效,但由于ArrayList在HashMap中,我遇到了问题。
private void removeDuplicate(HashMap<String, ArrayList<LinkedList<String>>> p)
{
//cycle for each entry of HashMap
for(Map.Entry<String, ArrayList<LinkedList<String>>> entry : p.entrySet())
{
ArrayList<LinkedList<String>> partitions = entry.getValue();
partitions = new ArrayList<LinkedList<String>>(new LinkedHashSet<LinkedList<String>>(partitions));
}
}
问题出现之后,HashMap和以前完全一样! 变量 partitions 不再有重复项,但整个HashMap没有变化。 问题在哪里?
答案 0 :(得分:3)
你永远不会把新名单写回地图。
您只需将原始列表列表分配到partitions
,然后为其分配一个新值,然后不要以任何方式使用该新值。
partitions = entry.getValue()
是一个引用分配 - 它将对原始列表的引用复制到partitions
变量中。 partitions
的新分配会覆盖引用,而不是它引用的对象。
答案 1 :(得分:2)
您只修改partitions
,它只是一个局部变量,您实际上并未修改地图条目的值,更新给定地图条目的值Map.Entry#setValue(V value)
for(Map.Entry<String, ArrayList<LinkedList<String>>> entry : p.entrySet()) {
ArrayList<LinkedList<String>> partitions = entry.getValue();
entry.setValue(new ArrayList<>(new LinkedHashSet<>(partitions)));
}
注意:这将删除LinkedList
重复项,而不是String
重复项