java - 如何从 HashMap 中删除重复值

标签 java hashmap

我不知道如何最好地描述我的问题,但在这里,我试图从 HashMap<String, String> map = new HashMap<String, String>(); 中删除相同的名称(值)

例如,如果这张 map 包含像这样的名字

    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");

我想使用方法 removeTheFirstNameDuplicates 从中删除所有值为“Antonio”的条目,我在 Google 中查看了几天,所有示例都接近我想要的,但不是我真正需要的。

我的想法是,我需要一些东西来检查 map ,如果它包含相同的值,则删除重复项。但是我该怎么做呢?

最佳答案

您可以使用以下只遍历 map 一次的方法来完成:

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();
        }
    }
}

HashSet 上的 add() 方法将返回 false 如果已将值添加到集合中。上面的方法使用它来检测是否找到了重复项,然后使用迭代器上的 remove() 方法从 HashMap 中删除重复项。

值得注意的是,根据您使用的 Map 实现,可能无法保证迭代顺序,因此也无法保证您删除的重复项。

如果您要使用 TreeMap 而不是 HashMap,您肯定会按键按字母顺序遍历 map ,例如Berluccio、Bracco、Carleone……Verdo。然后,您将始终保留 Stradivari 并删除 Vivaldi。

关于java - 如何从 HashMap 中删除重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22269271/

相关文章:

java - O(1) 的映射同时搜索键和值

blackberry - 缺少 java.util.HashMap

java - Apache POI : Storing key and sum in a Map

java - 通用对象的哈希函数

java - 在 Bukkit 中使用多个类作为命令?

java - Eclipse (Java) 中未找到源错误

java - HashMap 到 DefaultListModel

java - 如果 Maven 依赖项传递冲突,是否可以在中介期间将 Maven 依赖项标记为 "lower priority"?

java - 如何在 ActionBarSherlock 4.2.0 中启用强制溢出模式?

java - LDAP 查询未从 Active Directory 返回正确的数据