[英]Updating an entry of a HashMap whose values is a List
我有一個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
”
如果您能指出每個問題的問題,我們將不勝感激。
問題是當您通過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 個案例都執行得很好。
嘗試這個,
List<Integer> values = new ArrayList<>(Arrays.asList(c, d));
sq_diff.put(diff, values);
代替
sq_diff.put(diff, Arrays.asList(c, d));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.