我有一个将字符串键映射到哈希集值的哈希映射,当哈希映射的哈希集值为空时,我想从哈希映射中删除一个键。我很难接近这个。这是我尝试过的,但我很困:
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();
}