7

我有一个将字符串键映射到散列集值的散列图,当散列图的散列集值为空时,我想从散列图中删除一个键。我很难解决这个问题。这是我尝试过的,但我很困惑:

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...
}
4

3 回答 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()解决了这个问题,因为它不会使迭代器无效。

于 2013-04-08T06:09:42.033 回答
2

自 Java 8 以来,lambda 有一个极好的简短解决方案:

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

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

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

于 2019-01-28T08:35:36.547 回答
1
 Iterator<String> iterator = mMapFiles.keySet().iterator();
    while (iterator.hasNext()){
        if ( mMapFiles.get( iterator.next() ).size() < 1 )
            iterator.remove();
    }
于 2016-11-05T11:45:27.763 回答