Как заполнить хэш-карту с помощью arraylist? - PullRequest
0 голосов
/ 07 января 2019

Это как бы говорит само за себя, но как мне это заполнить?

Map<Integer,ArrayList<Integer>>intMap = new HashMap<Integer, ArrayList<Integer>>();

Я уже пробовал

intMap.put(1, 2);
intMap.put(1, 3); etc

и

intMap.put(1, (2, 3);

Ответы [ 5 ]

0 голосов
/ 07 января 2019

Простой, вы можете попробовать несколькими способами, как,

Map<Integer,ArrayList<Integer>>intMap = new HashMap<Integer, ArrayList<Integer>>();

intMap.put(101,new ArrayList<Integer>().add(1));
intMap.put(102,new ArrayList<Integer>().add(2));

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

ArrayList<Integer> list1=new ArrayList<Integer>();
list1.add(1);
list1.add(2);
...

ArrayList<Integer> list2=new ArrayList<Integer>();
list2.add(1);
list2.add(2);
...

Тогда

intMap.put(1,list1);
intMap.put(2,list2);
0 голосов
/ 07 января 2019

Если карта и списки не модифицируются после создания экземпляра, с Java 9 вы можете сделать:

Map<Integer, List<Integer>> map = Map.of(1, List.of(2, 3), 
                                         2, List.of(3, 5));

Если Карта и списки модифицируемы, вы можете следовать подходу Федерико Перальта Шаффнера и сделать его немного более удобным для пользователя, извлекая метод с помощью var-args:

void fill(Map<Integer, List<Integer>> map, Integer key, Integer... values) {
    map.computeIfAbsent(key, k -> new ArrayList<>())
       .addAll(Arrays.asList(values));
}

Теперь вы можете легко использовать его:

Map<Integer, List<Integer>> map = new HashMap<>();
fill(map, 1, 2, 3);
fill(map, 2, 4, 6);
fill(map, 2, 1);

Осторожно, передача ссылки null в var-args вызовет NullPointerException в Arrays.asList(values).

0 голосов
/ 07 января 2019
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
intMap.put(1, list);

list = new ArrayList<>();
list.add(4);
list.add(5);
list.add(6);
intMap.put(2, list);
0 голосов
/ 07 января 2019

Во-первых, не отображайте ArrayList. При использовании списков никогда не упоминайте более конкретные, чем List, за исключением одного места, где вы его создаете. Нет причин, по которым ваша карта не должна принимать другой тип списка. (Кроме того, если порядок не имеет значения, это должна быть просто Коллекция, а не Список. Объявите вещи как можно менее конкретными.)

Пост выше об использовании computeIfAbsent - правильный ответ, пока вы работаете с картой. Если вы просто пытаетесь инициализировать карту несколькими значениями, вы можете сделать это.

map.put(1, Arrays.asList(2,3));
map.put(2, Arrays.asList(7, 9, 11));
0 голосов
/ 07 января 2019

Вы должны использовать Map.computeIfAbsent:

intMap.computeIfAbsent(someKey, k -> new ArrayList<>()).add(someValue);

Например, чтобы иметь эти сопоставления:

1 -> [2, 3]
5 -> [8]
6 -> [7, 9, 4]

Вы могли бы сделать это так:

intMap.computeIfAbsent(1, k -> new ArrayList<>()).add(2);
intMap.computeIfAbsent(1, k -> new ArrayList<>()).add(3);

intMap.computeIfAbsent(5, k -> new ArrayList<>()).add(8);

intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(7);
intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(9);
intMap.computeIfAbsent(6, k -> new ArrayList<>()).add(4);

EDIT:

Map.computeIfAbsent эквивалентен этому коду:

List<Integer> list = intMap.get(someKey);
if (list == null) {
    list = new ArrayList<>();
    intMap.put(someKey, list);
}
list.add(someValue);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...