java - 更新值为 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
”条目
如果您能指出每个问题的问题,我们将不胜感激。
解决方案
麻烦是当您通过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 个案例都执行得很好。
推荐阅读
- c# - Selenium WebDriver 测试登录验证/身份验证
- javascript - Javascript 在 Safari 中工作,但在 Chrome 中不工作
- javascript - 用于在某些内容之后查找多个空格的正则表达式
- jquery - 在 Safari 浏览器 jquery 上使用 hostgator 不起作用
- vba - Excel VBA:将不同文件中的特定工作表拉入现有工作簿并更改名称
- java - TestNg Selenium-动态查找表列值
- grouping - SSRS 对除一个字段外的所有字段进行分组
- python - 在 Python 中,如何进入除块中的调试器并访问异常实例?
- javascript - 如何通过 FileReader 和文件名读取本地文件
- android - 如何在 android 上修改此设计?我可以将图标放在其他选项卡项目的左侧吗?