Java - 如何从HashMap中删除重复的条目?

时间:2014-10-07 19:31:12

标签: java hashmap duplicates

我在Java中有一个HashMap

HashMap<String, Integer> meh = new HashMap<String, Integer>();`

meh.put("one", 1);
meh.put("one", 1);
meh.put("one", 1);
meh.put("two", 1);
meh.put("two", 2);
meh.put("three", 3);

我需要删除重复的条目(&#34;一个&#34;,1)[当密钥和值重复时]。我搜索并发现只有如何删除重复的键/值&#39;。有人可以帮忙吗?

4 个答案:

答案 0 :(得分:3)

没有必要这样做,HashMap会自动处理。执行该代码时会发生什么,基本上如下:

meh.put("one", 1);

这使得地图{“one” - &gt; 1}

meh.put("one", 1);

这会自动替换分配,使地图成为{“one” - &gt; 1}

meh.put("one", 1);

这会自动替换分配,使地图成为{“one” - &gt; 1}

meh.put("two", 1);

这会添加请求的链接,使地图成为{“one” - &gt; 1,“两个” - &gt; 1}

meh.put("two", 2);

这取代了“two”的分配,使地图成为{“one” - &gt; 1,“两个” - &gt; 2}

meh.put("three", 3);

这会添加新元素,使总映射{“one” - &gt; 1,“两个” - &gt; 2,“三” - &gt; 3}没有涉及重复。

答案 1 :(得分:2)

您无法从HashMap删除重复项,因为首先HashMap中没有重复项。使用已存在于地图中的密钥调用put的第二个(或第三个,或任何其他)时间,它将简单地用新的值覆盖该值,无论它是否是预先复制的值现有的。

在您提供的代码段中,地图只有三个值。

答案 2 :(得分:2)

根据您的描述,Map<String, Integer>不是适合您需求的结构:您似乎没有将值2"two"联系起来,但实际上您正在存储元素对。

更好的数据结构可能是使用Set MyPair MyPair所在的位置:

public class MyPair {
    private String first;
    private int second;
    // + constructor, getters + setters, hashcode + equals
}

然后您可以在MyPair中使用该HashSet个对象:

Set<MyPair> myPairs = new HashSet();
myPairs.add(new MyPair("one", 1));
myPairs.add(new MyPair("one", 2));
myPairs.add(new MyPair("two", 2));    
myPairs.add(new MyPair("two", 2));
myPairs.remove(new MyPair("one", 2)); // remove MyPair("one", 2) only

答案 3 :(得分:1)

您真正的问题不是如何删除重复项。

如何使用重复键保留唯一值。

有关详情,请参阅Jon Skeet的回答https://stackoverflow.com/a/8229534/152578,但基本上您正在寻找多地图。

您必须检查插入时的值。

另一个选择是联合键和值(方法取决于你的符号空间),并将它们存储在一个集合中。