【问题标题】:Is list.clear() working backwards too?list.clear() 是否也向后工作?
【发布时间】:2017-05-23 16:54:08
【问题描述】:

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

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

【问题讨论】:

  • 您只是在创建一个列表作为重复添加对该列表的引用。我建议为您要添加的地图的每个值创建一个列表。
  • 感谢您的快速接受!
  • 您能否为我的其他问题提供更多帮助(请参阅您的答案下方的评论)。谢了!

标签: java list for-loop hashmap


【解决方案1】:

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

改为:在每次循环迭代期间创建一个列表temporary;然后将该列表放入您的地图中!

此外:您可能想要改进您的命名。你看,temporary 对这个变量所表示的东西什么都没有说。然后变量名应该是驼峰式,因为 firstInPair 更容易阅读。

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

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

【讨论】:

  • 谢谢!它完全有效!关于命名:这只是为了问题。我不得不用我的语言替换名字,以便每个人都能理解。但是谢谢你的好提示!
  • 无论如何我还是不明白为什么列表中包含使用 .clear() 方法删除的元素??
  • 问题是:您显示的源代码......有点不完整。如果您真的有兴趣解决这个难题,那么第一步是提出一个真实工作的minimal reproducible example 来显示问题。您当前拥有的代码......在该循环中甚至没有调用 clear!
  • 对不起,我的意思是为什么在列表中的 .clear() 之后,哈希图中的相同列表为空?
  • 如前所述:当您多次添加 the 相同的列表时,您最终会得到相同的列表。这就是您需要不同列表的原因;然后你就不再“清除”任何东西了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2022-01-17
  • 2011-08-31
相关资源
最近更新 更多