我在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;。有人可以帮忙吗?
答案 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,但基本上您正在寻找多地图。
您必须检查插入时的值。
另一个选择是联合键和值(方法取决于你的符号空间),并将它们存储在一个集合中。