2016-12-13 12 views
0

実行時は、temp = keysit.next()を指定したときに例外が発生したことを示します。私はこれが2回目にkeysit = keys.iterator()を再定義したときに気をつけていたと思ったが、おそらく私はそのポイントを見逃している。助言がありますか?Setを使用した場合のConcurentModificationException

Map<Integer, Set<String>> lhm = new LinkedHashMap<Integer, Set<String>>(); 

public void sortMap() { 
    Set<Integer> keys = hm.keySet(); 
    Iterator<Integer> keysit; 
    int iterations = keys.size(); 
    int smallest; 
    int temp; 
    for(int i=0; i<iterations; i++) { 
     keysit = keys.iterator(); 
     smallest = keysit.next(); 
     keysit = keys.iterator(); 
     while(keysit.hasNext()) { 
      temp = keysit.next(); 
      if(temp<smallest) 
       smallest = temp; 
      lhm.put(smallest, lhm.get(smallest)); 
      keys.remove(smallest); 
     } 
    } 
    System.out.println(lhm); 
} 

答えて

-1

をスレッドセーフではない - 反復中に変更を追跡するmodCountを。あなたが実際にこのmodcountを変更する集合から要素を削除するコード

keys.remove(smallest); 

の行を次のように

。次にnext()が呼び出されて次の要素を取得すると、modcountの値が変更されたかどうかがチェックされます。 「はい」の場合は、同時変更例外をスローします。

すべての変更はmodcountフラグに依存し、keys.iterator()を何回再定義するかに依存しません。 @Oluにより示唆されるように

一つの良いオプションは、それだけでだけでなく、シングルスレッドのアプリケーションでConcurrentModificationExceptionをスローします、

-1

代わりにハッシュマップbcozハッシュマップまたはマップのConcurrentHashMapを使用する点がイテレータ名前付き整数フラグ維持する

+0

スレッドの安全性がここでの問題ではないのConcurrentHashMapを使用することです。問題は、反復処理中に要素から要素を削除することです。反復子の 'remove()'メソッドがサポートされている場合は、その代わりにイテレータの 'remove()'メソッドを使うべきです。 –

関連する問題