1

マップを使用していくつかの削除を実行しているときに以下のエラーが発生します。これを回避するにはどうすればよいですか?

Caused by: java.util.ConcurrentModificationException
    at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
    at java.util.HashMap$EntryIterator.next(HashMap.java:834)
    at java.util.HashMap$EntryIterator.next(HashMap.java:832)


   Map<FormField, Object> ItemMap = domainItem.getValues();         
   for (Map.Entry<FormField, Object> ValMap : ItemMap.entrySet()) {         
       List<Field> groupIdList = Mapper.getGroupId(groupFieldId);           
       for (Field field : groupIdList) {
           ItemMap.put(new FormField(field), domainItem.getDomainItemLinkId());
       }
       ItemMap.remove(ValMap.getKey());
   }
4

4 に答える 4

11

アップデート:

Iterator を使用しConcurrentHashMapて、このシナリオを回避します

以下は例外をスローしません

    Map<Integer, String> map = new ConcurrentHashMap<Integer, String>();
    map.put(1, "a");
    map.put(2, "b");
    map.put(3, "c");
    map.put(4, "d");
    for (Iterator<Integer> keys = map.keySet().iterator(); keys.hasNext();) {
        Integer key = keys.next();
        String val = map.get(key);
        map.remove(key);
    }

または反復中に別のマップを使用し、最後にそれをソースにコピーします

例えば:

    Map<Integer, String> dummy = new HashMap<Integer, String>();
    map.put(1, "a");
    map.put(2, "b");
    map.put(3, "c");
    map.put(4, "d");
    dummy.putAll(map);
    for (Iterator<Integer> keys = dummy.keySet().iterator(); keys.hasNext();) {
        Integer key = keys.next();
        String val = map.get(key);
        map.remove(key);
    }
    System.out.println(map);
于 2012-09-11T10:49:52.240 に答える
0

Map は、キーと値のペアのキーによって並べ替えられます。反復処理中に Map から要素を追加または削除すると、プログラムは基本的に Map 内の「どこ」にあるかを追跡できなくなります。

これを回避するには、別の一時的な転送マップを作成してみてください。Iteratorあなたのニーズに合うかもしれないと呼ばれるクラスもあります。

于 2012-09-11T10:52:42.137 に答える
0

この問題を回避する 1 つの方法は、コピーを反復処理することです。

for (Map.Entry<FormField, Object> ValMap : 
     new HashMap<FormField, Object>(ItemMap).entrySet()) {
于 2012-09-11T10:53:02.130 に答える
0

マップのコピーなしで実行できます。この例を実行して、コードを見てください。

public static void main(String[] args)
  {

    System.out.println("creating map ...");

    Map<String, String> dummyMap = new HashMap<>();
    while (dummyMap.size() < 10)
    { dummyMap.put(String.valueOf(new Random().nextInt()), String.valueOf(new Random().nextInt())); }


    System.out.println("start, map size: " + dummyMap.size() + ", keys=" + dummyMap.keySet());


    System.out.print("going to remove: ");
    for (Iterator<String> keys = dummyMap.keySet().iterator(); keys.hasNext(); )
    {
      final String key = keys.next();

      // delete map entries per random
      if(new Random().nextInt(3)>1)
      {
        System.out.print(key+" ");
        keys.remove();
      }
    }
    System.out.print("\n");

    System.out.println("done, map size: " + dummyMap.size() + ", keys=" + dummyMap.keySet());
  }

この同様の質問を見てください。

HTH、

于 2014-09-26T20:14:34.910 に答える