如何从HashMap中删除重复的值

时间:2014-03-08 12:23:14

标签: java hashmap

我不知道如何才能最好地描述我的问题,但在这里,我正试图从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”值的条目,我在Google中查看了几天,所有示例都接近我想要的但不是我需要的

我的想法是,我需要检查地图的内容,如果它包含相同的值,则删除副本。但是我怎么能这样做呢?

2 个答案:

答案 0 :(得分:2)

您可以使用以下方法执行此操作,该方法仅迭代地图一次:

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

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

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

如果您使用的是TreeMap而不是HashMap,则可以确定按字母顺序按地图迭代地图,例如Berluccio,Bracco,Carleone ...... Verdo。然后你会一直保留Stradivari并删除Vivaldi。

答案 1 :(得分: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());