一些奇怪的问题。
我有一个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=[]}


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

最佳答案

您的问题是您不断在循环中向地图添加相同的列表对象。因此,所有映射键都指向相同的值(此处是罪魁祸首)。

相反:在每次循环迭代期间创建一个新列表pairmap.put(pairnumber, temporary);;然后将该列表放入您的地图!

此外:您可能想改善您的命名。您会看到,temporary对该变量表示的内容一无所获。然后,变量名应该用驼峰命名,因为firstInPair比较容易阅读。

最后:从该列表中删除元素没有意义-不必总是获取前两个元素,只需使用temporary resp进行两次调用即可。我+1。在您的小示例中,这并不重要,但是对于“现实世界”场景:删除ArrayList中的第一个元素是您可以在此类列表上执行的最昂贵的操作!

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

07-28 12:12