У меня есть 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
User_67128 21 Фев 2020 в 20:02

2 ответа

Лучший ответ

Попробуй это,

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

Вместо

sq_diff.put(diff, Arrays.asList(c, d));
2
abhimanyue 21 Фев 2020 в 17:36

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

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

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

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

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 дела выполнены хорошо.

3
nazar_art 26 Фев 2020 в 23:27