java - 更新值为 List 的 HashMap 条目

标签 java arraylist 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);

他们都没有工作:

Exception in thread "main" java.lang.UnsupportedOperationException

map 包含条目diff

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

最佳答案

问题是当您通过 Arrays.asList() 初始化列表时。正如文档中提到的:

This method also provides a convenient way to create a fixed-size list initialized to contain several elements

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

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

Lists.newArrayList(c, d);

它还提供 map 实用程序。

它的代码如下所示:

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

关于java - 更新值为 List 的 HashMap 条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60343281/

相关文章:

java - 如何将 Arraylist 转换为 2D double[][] 数组

java - 从java中的类添加值

java - 对使用 Java 中的通用类创建的 Arraylist 进行排序

java - Printf 小数位格式

java - 表格布局问题

java-如何将 ArrayList<ArrayList<String>> 转换为 String[]][]

java - 从另一个类访问 HashMap 数据时出现问题

java - 不区分大小写的映射键 Java

Java:如何检查Key是否映射到HashMap中?

java - Maven 多模块项目