我创建了一个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
我缺少一些东西。找不到我在哪里做错了。
答案 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键更新它时,更改也将应用于其他键。