【问题标题】:Delete an entry in hashmap while iterating迭代时删除哈希图中的条目
【发布时间】:2020-05-17 19:48:43
【问题描述】:
我有一个循环来迭代哈希图。如果满足条件,我需要从哈希图中删除键值对。我无法使用下面的代码来做到这一点。我怎样才能做到这一点?
for(HashMap.Entry<Integer,Character> m:commons.entrySet()){
while(i!=(int)m.getKey()){
i++;
}
if(s2.charAt(i)!=(int)m.getKey()){
commons.remove((int)m.getKey());
}
}
【问题讨论】:
标签:
java
hashmap
iteration
remove-if
【解决方案1】:
for (Iterator<Map.Entry<Integer, Character>> it = map.entrySet().iterator(); it.hasNext(); ) {
Map.Entry<Integer, Character> entry = it.next();
// casting to int is redundant in your code. I removed it.
while (i != entry.getKey()) i++;
if (s2.charAt(i) != entry.getKey()) {
it.remove();
}
}
您可以在迭代Map 时使用Iterator 安全删除。
您也可以查看.removeIf() (Java 8+),但在您的迭代中使用循环,这更具可读性,imo。
【解决方案2】:
- 您尝试这样做的方式可能会导致
ConcurrentModificationException。您应该使用 Iterator 或 Collection::removeIf,它们在内部使用 Iterator。
-
虽然您可以将char 与int 进行比较,但您可能在比较中混淆了键和值。你写了
if(s2.charAt(i)!=(int)m.getKey())
您将s2.charAt(i) 与Integer 的键进行比较。从语法上讲,它是正确的,但您可能想比较该值(这是一个 Characater),即您很可能想要这样做
if(s2.charAt(i)!=(int)m.getValue())
按如下方式进行:
for (Iterator<Entry<Integer, Character>> itr = commons.entrySet().iterator(); itr.hasNext();) {
Entry<Integer, Character> entry = itr.next();
while (i != entry.getKey()) {
i++;
}
if (s2.charAt(i) != entry.getValue()) {
itr.remove();
}
}