一些奇怪的问题。
我有一个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中的第一个元素是您可以在此类列表上执行的最昂贵的操作!
如前所述;您绝对不需要这样做。您的解决方案更复杂(更难以阅读/理解),并且在运行时更昂贵!