我有一个将字符串键映射到hashsets值的hashmap,我想在hashmaps的hashset值为空时从hashmap中删除一个键。我无法接近这个。这是我尝试过但我很困难的事情:
for(Map.Entry<String, HashSet<Integer>> entr : stringIDMap.entrySet())
{
String key = entr.getKey();
if (stringIDMap.get(key).isEmpty())
{
stringIDMap.remove(key);
continue;
}
//few print statements...
}
答案 0 :(得分:17)
为了避免ConcurrentModificationException
,您需要直接使用Iterator
界面:
Iterator<Map.Entry<String, HashSet<Integer>>> it = stringIDMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, HashSet<Integer>> e = it.next();
String key = e.getKey();
HashSet<Integer> value = e.getValue();
if (value.isEmpty()) {
it.remove();
}
}
您当前代码不起作用的原因是您尝试在迭代时从地图中删除元素。当你调用stringIDMap.remove()
时,这会使for-each循环在封面下使用的迭代器失效,从而无法进行进一步的迭代。
it.remove()
解决了这个问题,因为它不会使迭代器失效。
答案 1 :(得分:1)
Iterator<String> iterator = mMapFiles.keySet().iterator();
while (iterator.hasNext()){
if ( mMapFiles.get( iterator.next() ).size() < 1 )
iterator.remove();
}
答案 2 :(得分:1)
自Java 8起,有一个出色的lambda解决方案:
stringIDMap.entrySet().removeIf(ent -> ent.getValue().isEmpty());
或者您可以通过传递方法引用来使用更简洁的方式
stringIDMap.values().removeIf(Set::isEmpty);