【问题标题】:Remove duplicates from ArrayList issue从 ArrayList 问题中删除重复项
【发布时间】:2017-03-29 08:13:39
【问题描述】:

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

【问题讨论】:

  • 如何将partitions 与Hashmap 匹配?

标签: java arraylist hashmap duplicates


【解决方案1】:

您永远不会将新列表写回到地图中。

您只需将原始列表列表分配给partitions,然后为其分配一个新值,然后不要以任何方式使用该新值。

partitions = entry.getValue() 是一个引用赋值 - 它将对原始列表的引用复制到 partitions 变量中。 partitions 的新赋值会覆盖引用,而不是它所引用的对象

【讨论】:

    【解决方案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 重复

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 2021-12-24
      相关资源
      最近更新 更多