2 回答
TA贡献1852条经验 获得超7个赞
你的代码没有贴完整,不是很明白你要干什么,我推测注释那几行代码之前tempData这个集合是不是在外面定义的(也就是值while循环之前),如果是这样的话你每次执行trainDatas.add(tempData);添加的都是同一个对象,只是每次循环都把tempData的内容清除了重新添加,所以循环完了你trainDatas中的所有list里的内容肯定都是一致的,并且是最后一次循环所添加的内容。
针对这个问题很好理解,在List等集合中添加元素时,其实都是添加的元素的引用,当元素里的内容改变了,集合中加入的元素也会受影响。
例如一下一段代码,可能你期望输出是0~4,但你执行了发现输出了5个4:
List<List<Integer>> list = new ArrayList<>();
List<Integer> elements = new ArrayList<>();
for (int i = 0; i < 5; i++) {
if (!elements.isEmpty()) {
elements.clear();
}
elements.add(i);
list.add(elements);
}
for (List<Integer> ele : list) {
for (Integer i : ele) {
System.out.print(i + "\t");
}
}
// 输出 4 4 4 4 4
这和你上面的问题很类似,只需要把List<Integer> elements = new ArrayList<>();放入for循环里面,每次循环都新创建一个新的elements,问题就迎刃而解了。
List<List<Integer>> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
List<Integer> elements = new ArrayList<>();
if (!elements.isEmpty()) {
elements.clear();
}
elements.add(i);
list.add(elements);
}
for (List<Integer> ele : list) {
for (Integer i : ele) {
System.out.print(i + "\t");
}
}
// 输出 0 1 2 3 4
TA贡献1854条经验 获得超8个赞
用ArrayList<String> tempData = new ArrayList<>();的时候,每一次while循环都是创建了一个新的arraylit对象,他跟其它的对象并没有任何关联,所以每次添加到traindatas时结果都是不一样的,但是你注释掉的语句始终都是同一个对象,只是做了clear,这会导致你traindatas中加入的tempdata,实际上都是同一个东西
添加回答
举报