list.clear()也在向后工作吗?

时间:2017-01-09 12:11:44

标签: java list for-loop hashmap

一些奇怪的问题。 我有一个for循环,从列表中获取绘制数字并成对排列。我想要一个存储巴黎和图号的散列图,所以;

有一个包含以下内容的列表:1,2,3,4,5,6,7,8 for循环从这里开始, 1:1和2 2:3和4 3:5和6 4:7和8

这就是我创造的东西;

List<Integer> numbers = new List<Integer>;
HashMap<Integer, <List<Integer>> parimap = new HashMap<Integer,<List<Integer>>;

for(int i=0; i<4; i++){
        int firstinpair = numbers.get(0);
        int secondinpair = numbers.get(1);
        numbers.remove(0);                       //so it won't repeat
        numbers.remove(0);                      
        int pairnumber=i+1;
        temporary.add(0,firstinpair);
        temporary.add(0, secondinpair);
        pairmap.put(pairnumber, temporary);
}

我得到的是:

{1=[5, 2, 6, 4, 8, 3, 1, 7], 2=[5, 2, 6, 4, 8, 3, 1, 7], 3=[5, 2, 6, 4, 8, 3, 1, 7], 4=[5, 2, 6, 4, 8, 3, 1, 7]}

我试过这样:

temporary.add(firstinpair);
temporary.add(secondinpair);
pairmap.put(pairnumber, temporary);
temporary.clear();

然后:

{1=[], 2=[], 3=[], 4=[]}

我不知道我做错了什么。 请帮忙!

1 个答案:

答案 0 :(得分:2)

您的问题是您在循环中不断将相同列表对象添加到地图中。所以所有地图键都指向相同的值(pairmap.put(pairnumber, temporary);是罪魁祸首。)

相反:在每次循环迭代期间创建 new 列表temporary;然后将该列表放入您的地图!

此外:您可能希望改进命名。你看,temporary nothing 关于这个变量所代表的东西。然后变量名称应该是camelCase,因为firstInPair更容易阅读。

最后:从该列表中删除元素时没有没有点 - 而不是总是获取前两个元素,您只需使用get(i) resp进行两次调用。 I + 1。它在您的小示例中并不重要,但对于“真实世界”场景:删除ArrayList中的 first 元素是您可以执行的最昂贵的操作这样的名单!

如上所述;你绝对不需要这样做。您的解决方案更复杂(更难阅读/理解)并且在运行时更昂贵!