我不知道如何才能最好地描述我的问题,但在这里,我正试图从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中查看了几天,所有示例都接近我想要的但不是我需要的
我的想法是,我需要检查地图的内容,如果它包含相同的值,则删除副本。但是我怎么能这样做呢?
答案 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());