如何从HashMap中删除重复的值

4

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

例如,如果这个映射包含像

    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”的条目。我在谷歌上搜索了几天,所有的示例都接近我所需的,但并非真正我需要的。

我的想法是,我需要检查一个映射表,并且如果它包含相同的值,则删除重复项。但是我该如何做到这一点呢?


1
迭代条目并删除您不喜欢的条目。 - Boris the Spider
你的映射表可能需要反转,并且应该是一个 Map<String, List<String>>,其中键是名字的姓氏,值是名字列表。你用这个映射表做什么?你确定你不应该使用 List<Musician> 吗? - JB Nizet
这是一个创建名称映射的方法。 - Predict_it
@JBNizet 我认为Stradivari是一位制琴师而不是音乐家。 ;) - Boris the Spider
1
@Bohemian你当选了吗?恭喜! - Boris the Spider
显示剩余4条评论
2个回答

5
你可以使用以下方法,只需对映射进行一次迭代即可完成:
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();
        }
    }
}
HashSetadd()方法会在集合中已经存在该值时返回false。上述方法使用这一点来检测是否存在重复项,然后使用迭代器上的remove()方法从HashMap中删除重复项。
值得注意的是,根据您使用的Map实现,迭代顺序可能无法保证,因此要删除的重复项也不被保证。
如果您使用TreeMap而不是HashMap,则可以确保按字母顺序按键对地迭代映射,例如Berluccio,Bracco,Carleone ... Verdo。 然后始终保留Stradivari并删除Vivaldi。

0

试试这个

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

每次调用 Collections.frequency() 都会遍历整个列表吗? - Richard Miskin
是的。这是即兴思考。可能有更好/更短的解决方案。 - Abiel Paltao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接