簡體   English   中英

更新值為 List 的 HashMap 的條目

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM