>

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?
        }
    }


  • 답변 # 1

    내가 아는 한, 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());
        }
    }
    
    

    출력 :

    와이즈 비즈 LinkedHashMap의 특정 인덱스에 요소를 추가하기위한 코드 여기에서

    Test Map before :: {1=One, 2=Two, 3=Three, 4=Four}
    Test Map after :: {1=One, 2=Two, 44=FourFour, 4=Four}

  • 이전 android - 서비스를 수동으로 중지하는 방법은 무엇입니까?
  • 다음 java - orgbouncycastleoperatoroperatorcreationexception - 서명자를 작성할 수 없음 : 서명 (제공자 : bc)에 대해 구성된 클래스를 찾을 수 없습니다