首页 > 解决方案 > 更新值为 List 的 HashMap 的条目

问题描述

我有一个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);

他们都没有工作:

线程“主”java.lang.UnsupportedOperationException 中的异常

该地图包含一个diff”条目

如果您能指出每个问题的问题,我们将不胜感激。

标签: javaarraylisthashmap

解决方案


麻烦是当您通过Arrays.asList()初始化列表时。如文档中所述:

此方法还提供了一种方便的方法来创建一个固定大小的列表,该列表已初始化为包含多个元素

稍后,当您想通过添加新元素来更新固定大小的列表UnsupportedOperationException时: .

作为一种解决方案,您可以使用非常有用的 Guava 的Lists实用程序类:

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 个案例都执行得很好。


推荐阅读