更新TreeMap <string,arraylist <integer >>中的单个键会更改所有键值

时间:2018-11-07 16:40:32

标签: java arraylist hashmap

我创建了一个TreeMap>并为所有键设置了arraylist值(0,0),然后仅更新了一个键值。但这最终会更新所有键值。这是我的简化代码

import java.util.*;

public class Test {
    public static void main(String[] args) {
        TreeMap<String, ArrayList<Integer>> treeMap = new TreeMap<>();
        String[] moduleList = {"apple", "orange", "grape"};
        ArrayList<Integer> emptyInitialArrayList = new ArrayList<>(Arrays.asList(0, 0));
        for (String tempModule : moduleList) {
            treeMap.put(tempModule, emptyInitialArrayList);
        }
        ArrayList<Integer> tempModuleMap = treeMap.get("apple");
        tempModuleMap.set(0, tempModuleMap.get(0) + 1);
        for (Map.Entry<String, ArrayList<Integer>> test : treeMap.entrySet()) {
            System.out.println(test.getKey());
            System.out.println(test.getValue().get(0));
            System.out.println(test.getValue().get(1));
        }
    }
}

此代码的输出:

apple
1
0
grape
1
0
orange
1
0

我缺少一些东西。找不到我在哪里做错了。

2 个答案:

答案 0 :(得分:3)

要修复,只需将新的ArrayList调用放入循环中即可。否则,您将在所有键上共享同一个值对象

    String[] moduleList = {"apple", "orange", "grape"};
    for (String tempModule : moduleList) {
        ArrayList<Integer> emptyInitialArrayList = new ArrayList<>(Arrays.asList(0, 0));
        treeMap.put(tempModule, emptyInitialArrayList);
    }

答案 1 :(得分:0)

您必须为每个临时模块添加一个新的空初始数组列表。

  for (String tempModule : moduleList) {
        ArrayList<Integer> emptyInitialArrayList = new ArrayList<>(Arrays.asList(0, 0));
        treeMap.put(tempModule, emptyInitialArrayList);
    }

您的代码当前为映射中的每个键都放置了相同的数组列表实例。因此,当您以后为Apple键更新它时,更改也将应用于其他键。