当值的hashset为Empty时,删除hashmap中的键

时间:2013-04-08 06:06:00

标签: java hashmap set hashset

我有一个将字符串键映射到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...
}

3 个答案:

答案 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);