向列表添加新元素将替换之前的元素

时间:2018-09-21 09:13:24

标签: java list arraylist

得到错误的输出 在这里,我有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]]

1 个答案:

答案 0 :(得分:3)

调用clear时,不是在创建新列表,而是在删除现有列表的内容(清空在先前迭代中已添加的列表的内容)。

然后,当您在当前迭代中将它们再次添加到motherList时,只需添加两个指向相同旧对象的新引用(因此最终会有4个指向两个对象的引用)。

要解决此问题,您必须重新初始化列表,而不是使用clear

chkptPrice.clear(); -> chkptPrice = new LinkedList<>(); 
fuelNeeded.clear(); -> fuelNeeded = new LinkedList<>();