当值的哈希集为空时删除哈希映射中的键



我有一个将字符串键映射到哈希集值的哈希映射,当哈希映射的哈希集值为空时,我想从哈希映射中删除一个键。我很难接近这个。这是我尝试过的,但我很困:

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

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

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

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

或者你可以用更简洁的方式传递方法引用

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

 Iterator<String> iterator = mMapFiles.keySet().iterator();
    while (iterator.hasNext()){
        if ( mMapFiles.get( iterator.next() ).size() < 1 )
            iterator.remove();
    }

最新更新