2011-06-30 10 views
15

HashMapで繰り返し処理する方が良い理由についての説明や洞察を探しています。Java HashMap Key/Valueを削除する

たとえば、以下のコード(私の目の中の)はまったく同じです(またはそれはすべきです)。しかし、私がHashMapを反復処理しなければ、キーは削除されません。

_adjacentNodes.remove(node);   

Iterator<Map.Entry<String, LinkedList<Node>>> iterator = _adjacentNodes.entrySet().iterator(); 
while (iterator.hasNext()) { 
    Map.Entry<String, LinkedList<Node>> entry = iterator.next(); 
    if(node.getNodeID().contentEquals(entry.getKey())){ 
      iterator.remove(); 
    } 
} 

何が起こっているのですか?

答えて

13

あなたのキーはStringなので、String not Nodeを削除する必要があります。だから試してみてください

_adjacentNodes.remove(node.getNodeID()); 
8

remove()は期待通りに動作します。次

import java.util.HashMap; 


public class HashMapExample { 
    public static void main(String[] args) { 
     HashMap<String, Integer> map = new HashMap<String, Integer>(); 

     map.put("a", 1); 
     map.put("b", 2); 

     System.out.println("Before removal"); 
     for(String s : map.keySet()) { 
      System.out.println(s); 
     } 

     System.out.println("\n\nAfter removal"); 

     map.remove("a"); 
     for(String s : map.keySet()) { 
      System.out.println(s); 
     } 
    } 
} 

この意志出力:たとえば、このプログラムを与え

Before removal 
b 
a 


After removal 
b 

私はこれが間違って起こっていると考えることができる唯一のことは、ノードオブジェクトあなたは開始時に削除しようとしているということですイテレータから取得したものと同じノードオブジェクトではありません。つまり、それらは同じ 'NodeID'を持っていますが、異なるオブジェクトです。おそらく、remove()の戻り値をチェックする価値があります。

編集:Ha私は文字列/オブジェクトの間違いを見つけられませんでしたが、少なくとも正しい経路を下っていました。 )

+0

ちょうど私のキーが文字列であり、私はオブジェクトを削除しようとしていたと答えた。 –

+0

はい、私が入力していた間彼が投稿した編集を参照してください。 –

0

ここでのポイントは、ハッシュマップを反復処理して操作しようとすると、それを行うことができないために失敗することです(例外もあります)。

したがって、イテレータを使用して、反復処理中のリストのアイテムを削除する必要があります。

+2

あなたの投稿は真実ではありません。コレクションに関するオラクルのチュートリアルを引用するには _反復中にコレクションを変更する唯一の安全な方法はIterator.removeです。反復の進行中に基礎となるコレクションが他の方法で変更されている場合、その動作は指定されていません。_ [引用元を参照](http://download.oracle.com/javase/tutorial/collections/interfaces/collection) html) – comrad

関連する問題