簡體   English   中英

迭代時刪除 hashmap 中的一個條目

[英]Delete an entry in hashmap while iterating

我有一個循環來迭代 hashmap。 如果滿足條件,我需要從 hashmap 中刪除鍵值對。 我無法使用下面的代碼來做到這一點。 我怎樣才能做到這一點?

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());
    }
}
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。

  1. 您嘗試執行此操作的方式可能會導致ConcurrentModificationException 您應該使用內部使用IteratorIteratorCollection::removeIf
  2. 盡管您可以將charint進行比較,但可能您在比較中混淆了鍵和值。 你寫

    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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM