得到错误的输出 在这里,我有3个列表“ chkptPrice”,“ fuelNeeded”和“ motherList”。因此,在循环中,我将新元素添加到“ chkptPrice”和“ fuelNeeded”中,然后在此之后,将两个列表都添加到“ motherList”中。第一次运行Loop时,一切正常,但是之后,当我使用“ chkptPrice”和“ fuelNeeded”向“ motherList”添加新元素时,整个List会被相同的元素替换并重复这些元素。
System.out.println("Enter the test cases");
int tess = scan.nextInt();
scan.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
System.out.println("Enter the number of checkpoints: ");
int checkpt = scan.nextInt();
scan.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
List<List<Integer>> motherList = new ArrayList<List<Integer>>();
List<Integer> chkptPrice = new ArrayList<Integer>();
List<Integer> fuelNeeded = new ArrayList<Integer>();
for(int i=0; i<tess; i++)
{
chkptPrice.clear();
fuelNeeded.clear();
String[] price = scan.nextLine().split(" ");
for(int j=0; j<checkpt; j++)
{
int intPrice = Integer.parseInt(price[j]);
chkptPrice.add(intPrice);
}
String[] fueldist = scan.nextLine().split(" ");
for(int j=0; j<checkpt; j++)
{
int intDist = Integer.parseInt(fueldist[j]);
fuelNeeded.add(intDist);
}
System.out.println("Elements in chktPrice: "+chkptPrice);
System.out.println("Elements in fuelNeeded: "+fuelNeeded);
motherList.add(chkptPrice);
motherList.add(fuelNeeded);
System.out.println("Elements of motherList: "+motherList);
}
=====输入======
2
2
1 3
4 6
4 9
1 8
=====输出======
{第一循环}
Elements in chktPrice: [1, 3]
Elements in fuelNeeded: [4, 6]
Elements of motherList: [[1, 3], [4, 6]]
{第二循环}
Elements in chktPrice: [4, 9]
Elements in fuelNeeded: [1, 8]
Elements of motherList: [[4, 9], [1, 8], [4, 9], [1, 8]]
motherList元素应为
[[1,3],[4,6],[4,9],[1,8]]
答案 0 :(得分:3)
调用clear
时,不是在创建新列表,而是在删除现有列表的内容(清空在先前迭代中已添加的列表的内容)。
然后,当您在当前迭代中将它们再次添加到motherList时,只需添加两个指向相同旧对象的新引用(因此最终会有4个指向两个对象的引用)。
要解决此问题,您必须重新初始化列表,而不是使用clear
。
chkptPrice.clear(); -> chkptPrice = new LinkedList<>();
fuelNeeded.clear(); -> fuelNeeded = new LinkedList<>();