Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从HashMap中删除重复值_Java_Hashmap - Fatal编程技术网

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()
的每次调用是否都将迭代整个列表?是的。这是在思考。可能有更好/更短的解决方案。