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

问题描述 投票:6回答:3

我有一个将字符串键映射到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...
}
java hashmap set hashset
3个回答
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
投票
 Iterator<String> iterator = mMapFiles.keySet().iterator();
    while (iterator.hasNext()){
        if ( mMapFiles.get( iterator.next() ).size() < 1 )
            iterator.remove();
    }

1
投票

从Java 8开始,lambda有一个很好的简短解决方案:

stringIDMap.entrySet().removeIf(ent -> ent.getValue().isEmpty());

或者您可以通过传递方法引用来使用更简洁的方法

stringIDMap.values().removeIf(Set::isEmpty);

© www.soinside.com 2019 - 2024. All rights reserved.