【问题标题】:Loop printing correct answer but adding wrong one to map?循环打印正确答案但添加错误答案到地图?
【发布时间】:2014-01-17 22:30:24
【问题描述】:

(右键单击并在新标签中打开图像以查看更大的图像)

除了代码没什么好说的:

System.out.println("map add:" + parts[i].split("=")[0] + "=" + list);
        map2.put(parts[i].split("=")[0], list);

打印出的内容与添加到地图的内容完全相同,但打印的内容与地图上的内容完全不同? 这是为什么?

【问题讨论】:

    标签: java arraylist hashmap bufferedreader


    【解决方案1】:

    您在每次迭代中添加相同的列表,因此键引用相同的列表(见下图)。 你实际上在做的是这样的:

    1. 您创建了一个包含值 [root, like] 的列表,并将此列表与键 root 关联
    2. 在第二次迭代中,您清除列表并将[eat, it] 添加到此列表并将其与另一个键xsubj 关联。

    由于您没有创建新对象,键 rootxsubj 指向同一个列表对象,因此列表上的每个更改都将反映在共享它的所有键上。

    这就是为什么最后你得到了这个输出。

    不要调用clear(),而是在每次迭代时创建一个新列表。

    for(int i = 0; i < parts.length; i++){
      list = new ArrayList<>();
      list.add(...);
      /**
       * The code
      **/
    }
    

    【讨论】:

    • 好吧,这么清楚没有做任何事情,我一直在列表中添加更多内容,但由于它只需要第一个和第二个,它会重复同样的事情吗?
    • @user2871826 查看我的编辑并告诉我您是否了解自己在做什么。
    • 是的,我明白出于某种原因,我认为 clear() 就像删除所有内容一样,并且与创建新内容具有相同的效果,但显然我错了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多