Обновление записи HashMap со значениями List - PullRequest
2 голосов
/ 21 февраля 2020

У меня есть HashMap<Integer, List<Integer>> "sq_diff", и я пытаюсь обновить запись.

Я пытался:

List<Integer> values = sq_diff.get(diff);
values.add(c);
values.add(d);
sq_diff.put(diff, values);

и

sq_diff.get(diff).add(c);
sq_diff.get(diff).add(d);

и

sq_diff.computeIfPresent(diff, (k, v) -> v.add(c);
sq_diff.computeIfPresent(diff, (k, v) -> v.add(d);

Ни один из них не работает:

Исключение в потоке "main" java .lang.UnsupportedOperationException

Карта содержит запись"diff"

Высоко ценится, если вы можете указать проблемы на каждом из них.

Ответы [ 2 ]

3 голосов
/ 21 февраля 2020

Проблема в том, что вы инициализируете свой список с помощью Arrays.asList () . Как упомянуто в документации:

Этот метод также предоставляет удобный способ создания списка фиксированного размера, инициализированного для нескольких элементов

и позже, когда вы хотите обновить ваш список фиксированного размера с добавлением новых элементов, которые вы получили: UnsupportedOperationException.

В качестве решения вы можете использовать довольно полезный Guava's Списки класс утилит:

Lists.newArrayList (c, d);

Также предусмотрены Maps утилиты.

Код для него будет выглядеть так:

public class MapDemo {
    public static void main(String[] args) {
        final int diff = 42;
        HashMap<Integer, List<Integer>> map = Maps.newHashMap();
        map.putIfAbsent(diff, Lists.newArrayList(1, 2));
        // 1:            
        final List<Integer> integers = map.get(diff);
        integers.add(10);
        integers.add(11);
        // 2: 
        map.get(diff).add(20);
        map.get(diff).add(21);
        // 3:    
        map.computeIfPresent(diff, (k, v) -> {
            v.add(30);
            return v;
        });
        map.computeIfPresent(diff, (k, v) -> {
            v.add(31);
            return v;
        });

        System.out.println(map);
    }
}

Выход:

{42 = [1, 2, 10, 11, 20, 21, 30, 31]}

Как видите, все 3 дела выполнены хорошо.

2 голосов
/ 21 февраля 2020

Попробуйте,

List<Integer> values = new ArrayList<>(Arrays.asList(c, d));
sq_diff.put(diff, values);

вместо

sq_diff.put(diff, Arrays.asList(c, d));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...