Значение карты переопределяется в java - PullRequest
0 голосов
/ 14 января 2020

Я пытаюсь добавить разные значения для одного и того же ключа на карте, а затем сохранить его в списке и код ниже

public static void main(String[] args) {
    Map<String, Object> mainMap = new HashMap<>();
    List<Object> list = new ArrayList<>();
    mainMap.put("1", "First");

    for (int i = 1; i < 6; i++) {
        Map<String, Object> childMap = new HashMap<>();
        childMap.put("2", i);
        mainMap.put("1", childMap.get("2"));
        list.add(mainMap);
        System.out.println("mainMap:" + mainMap);
    }

    System.out.println("list:" + list);
}

Фактический результат:

mainMap:{1=1}
mainMap:{1=2}
mainMap:{1=3}
mainMap:{1=4}
mainMap:{1=5}
list:[{1=5}, {1=5}, {1=5}, {1=5}, {1=5}]

Ожидается вывод:

list:[{1=1}, {1=2}, {1=3}, {1=4}, {1=5}]

Возможно ли добиться этого с помощью карты, и если да, пожалуйста, наставьте меня.

Ответы [ 2 ]

0 голосов
/ 14 января 2020

Экземпляр Map заменяет старое значение, если в него введено значение с тем же ключом, поскольку Map не может хранить повторяющиеся ключи. Поскольку вы помещаете значения итерации для одного и того же ключа в один и тот же экземпляр mainMap, новое значение заменяет старое. Вам нужно присвоить новый экземпляр mainMap каждый раз, когда вы вводите в него значение итерации, используя тот же ключ. Следующий код даст вам подсказку для продолжения:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Object> map;
        List<Object> list = new ArrayList<Object>();
        for (int i = 1; i < 6; i++) {
            map = new HashMap<String, Object>();
            map.put("1", i);
            list.add(map);
        }
        System.out.println("list:" + list);
    }
}

Вывод:

list:[{1=1}, {1=2}, {1=3}, {1=4}, {1=5}]
0 голосов
/ 14 января 2020

Было бы невозможно достичь желаемого результата с помощью Map. Согласно документации Java:

Объект, который сопоставляет ключи со значениями. Карта не может содержать дубликаты ключей; каждый ключ может соответствовать максимум одному значению. https://docs.oracle.com/javase/8/docs/api/java/util/Map.html

В качестве альтернативы вы можете попытаться сохранить List в Map, например:

public static void main(String[] args) {
    Map<String, Object> mainMap = new HashMap<>();
    List<Object> childList = new ArrayList<>();
    mainMap.put("1", childList);
    for (int i = 1; i < 6; i++) {
        childList.add(i);
    }
    List<Object> list = new ArrayList<>();
    list.add(mainMap);
    System.out.println("list:" + list);
}

Вывод: list:[{1=[1, 2, 3, 4, 5]}]

...