从ArrayList问题中删除重复项

时间:2016-11-15 12:34:17

标签: java arraylist hashmap duplicates

我正在尝试使用流行的技术从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没有变化。 问题在哪里?

2 个答案:

答案 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重复项