Java 如何从HashMap中删除重复值
我不知道如何才能最好地描述我的问题,但在这里,我正试图从Java 如何从HashMap中删除重复值,java,hashmap,Java,Hashmap,我不知道如何才能最好地描述我的问题,但在这里,我正试图从HashMap=newhashmap()中删除相同的名称(值) 例如,如果此映射包含以下名称 map.put("Vivaldi","Antonio"); map.put("Belucci", "Monica"); map.put("Gudini", "Harry"); map.put("Verdo", "Dhuzeppe"); map.put("Maracci", "Bruno"); map.
HashMap=newhashmap()中删除相同的名称(值)代码>
例如,如果此映射包含以下名称
map.put("Vivaldi","Antonio");
map.put("Belucci", "Monica");
map.put("Gudini", "Harry");
map.put("Verdo", "Dhuzeppe");
map.put("Maracci", "Bruno");
map.put("Carleone", "Vito");
map.put("Bracco", "Luka");
map.put("Stradivari", "Antonio");
我想用方法删除所有带有“Antonio”值的条目,方法是removeTheFirstNameDuplicates
,我在谷歌搜索了几天,所有示例都接近我想要的,但不是我真正需要的
我的想法是,我需要一些东西来检查一个地图,如果它包含相同的值,然后删除重复。但是我该怎么做呢?试试这个
ArrayList<String> values = new ArrayList<String>();
ArrayList<String> keys = new ArrayList<String>();
java.util.Iterator<Entry<String, String>> iterate = map.entrySet()
.iterator();
while (iterate.hasNext()) {
Entry mapEntry = iterate.next();
String key = (String) mapEntry.getKey();
String value = (String) mapEntry.getValue();
values.add(value);
keys.add(key);
}
for (int i = 0; i < values.size(); i++) {
if (Collections.frequency(values, values.get(i)) > 1) {
map.remove(keys.get(i));
}
}
System.out.println(map.toString());
ArrayList值=新的ArrayList();
ArrayList键=新的ArrayList();
java.util.Iterator iterate=map.entrySet()
.iterator();
while(iterate.hasNext()){
条目mapEntry=iterate.next();
字符串键=(字符串)mapEntry.getKey();
字符串值=(字符串)mapEntry.getValue();
增加(价值);
key.add(key);
}
对于(int i=0;i1){
map.remove(key.get(i));
}
}
System.out.println(map.toString());
您可以使用以下方法执行此操作,该方法仅在地图上迭代一次:
private static void removeTheFirstNameDuplicates(final Map<String, String> map) {
final Iterator<Entry<String, String>> iter = map.entrySet().iterator();
final HashSet<String> valueSet = new HashSet<String>();
while (iter.hasNext()) {
final Entry<String, String> next = iter.next();
if (!valueSet.add(next.getValue())) {
iter.remove();
}
}
}
private static void删除firstname副本(最终映射){
最终迭代器iter=map.entrySet().Iterator();
最终HashSet valueSet=新HashSet();
while(iter.hasNext()){
最终条目next=iter.next();
如果(!valueSet.add(next.getValue())){
iter.remove();
}
}
}
如果已将值添加到集合中,则HashSet
上的add()
方法将返回false
。上面的方法使用它来检测是否找到了重复项,然后使用迭代器上的remove()
方法从HashMap
中删除重复项
值得注意的是,根据您使用的Map
实现,可能无法保证迭代顺序,因此也无法保证删除哪个副本
如果要使用TreeMap
而不是HashMap
,则一定要按字母顺序按键在地图上迭代,例如Berluccio、Bracco、Carleone…Verdo。然后,您将始终保留Stradivari并删除Vivaldi。并删除您不喜欢的地图。您的地图可能应该反转,成为一个地图,其中键是名字,值是名字列表。你用这张地图干什么?您确定不应该使用列表吗?这是创建names@JBNizet我认为斯特拉迪瓦里是一个琴师,而不是一个音乐家@波希米亚人你当选了?祝贺对Collections.frequency()
的每次调用是否都将迭代整个列表?是的。这是在思考。可能有更好/更短的解决方案。