2017-12-22 19 views
1

LinkedHashMapからキー/値のペア全体を置換しようとしていますが、機能していないようです。私は同時修正例外を取得しています。 大きな変更なしに同じ位置にあるキーのキー/値ペア全体を置き換える方法はありますか?同じ置き換え位置のLinkedHashmapからキー/値のペア全体を置換する方法

私は、次の操作を実行しようとした:

Map<String, String> testMap = new LinkedHashMap<String, String>(); 
    testMap.put("1", "One"); 
    testMap.put("2", "Two"); 
    testMap.put("3", "Three"); 
    testMap.put("4", "Four"); 
    testMap.put("5", "Five"); 
    testMap.put("6", "Six"); 
    /* 
    * Removing an element from the Map. 
    */ 
    Iterator<Entry<String, String>> iter = testMap.entrySet().iterator(); 
    while (iter.hasNext()) { 
     Map.Entry<String, String> entry = (Map.Entry<String, String>) iter.next(); 
     System.out.print(entry.getKey() + "->" + entry.getValue() + "; "); 
     if (entry.getKey().equals("1")) 
      iter.remove(); // remove one entry (key/value) with key "1". Ok 

     if (entry.getValue().equalsIgnoreCase("Two")) 
      iter.remove(); // removing all entries (key/value) for value "Two". Ok 

     if (entry.getKey().equals("3")) 
      entry.setValue("Updated_Three"); // Updating value for key 3. Ok 

     // Below how to now add a new key/value pair in my testMap at this position 
     // without affecting any other order? 
     if (entry.getKey().equals("4")) { 
      iter.remove(); 
      // How to now add a new key/value pair at this position without affecting any 
      // other order. 
      // testMap.put("44", "FourFour"); // Removing entry with key 4 and adding a new 
      // key/valuepair to hashmap. It throws ConcurrentModificationException. Any 
      // other way to perform this? 
     } 
    } 
+2

なぜですか? 'LinkedHashMap'の反復順序は挿入順序として定義されています*。なぜそれを壊したいのですか? – EJP

+0

@EJP私の用途は、古いキーと値のペアのエントリが削除されたのと同じ位置にエントリ(キー/値)を追加することです。あなたが何か考えている場合は、共有してください... – vinsinraw

+0

@vinSあなたは、testMap.put( "44"、 "FourFour");実際には、同じ位置のキー/値を置き換えるためのこのステートメントへの代替方法があるかどうかを知りたかったのです。 – vinsinraw

答えて

2

私の知る限り理解しているとして、あなたはのLinkedHashMapに固執したいです。これを反復しながら新しいデータを追加しようとすると(LinkedHashMapの構造を変更する)、ConcurrentModificationExceptionが発生します。

public static void main(String args[]) throws IOException { 

    Map<String, String> testMap = new LinkedHashMap<>(); 
    testMap.put("1", "One"); 
    testMap.put("2", "Two"); 
    testMap.put("3", "Three"); 
    testMap.put("4", "Four"); 

    int indexOfFourtyFour = -1; 
    System.out.println("Test Map before :: " + testMap); 

    Iterator<Entry<String, String>> itr = testMap.entrySet().iterator(); 
    int index = 0; 
    while (itr.hasNext()) { 
     Map.Entry<String, String> entry = (Map.Entry<String, String>) itr.next(); 
     if (entry.getKey().equals("3")) { 
      itr.remove(); 
      indexOfFourtyFour = index; 
     } 
     index ++; 
    } 
    if (indexOfFourtyFour > -1) { 
     add(testMap, indexOfFourtyFour, "44", "FourFour"); 
    } 
    System.out.println("Test Map after :: " + testMap); 
} 

public static <K, V> void add(Map<K, V> map, int index, K key, V value) { 
    assert (map != null); 
    assert !map.containsKey(key); 
    assert (index >= 0) && (index < map.size()); 

    int i = 0; 
    List<Entry<K, V>> rest = new ArrayList<Entry<K, V>>(); 
    for (Entry<K, V> entry : map.entrySet()) { 
     if (i++ >= index) { 
      rest.add(entry); 
     } 
    } 
    map.put(key, value); 
    for (int j = 0; j < rest.size(); j++) { 
     Entry<K, V> entry = rest.get(j); 
     map.remove(entry.getKey()); 
     map.put(entry.getKey(), entry.getValue()); 
    } 
} 

出力::前

テストマップ:: {1 =ワン、3 =三2 =つ、4 =四}
コードの下

はあなたの要件を満たす可能性がありますテストマップ:: {1 = 1、2 = 2、44 = 4Four、4 = 4}

LinkedHashMapの特定のインデックスに追加する要素のコード からHERE

+1

ありがとうございました@vinS。出来た :)。 Java APIにはiter.remove()やentry.setValue(..)に似たイテレータやエントリオブジェクトのメソッドを使った簡単な解決策があると思っていました。どのようにこれはjava8を使用して達成することができますどのような考えですか? – vinsinraw

関連する問題