简体   繁体   中英

java ArrayList about the result

    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    ArrayList<Integer> temp = new ArrayList<>();
    temp.add(1);
    temp.add(2);
    result.add(temp);
    temp.remove(temp.size() - 1);
    temp.add(1, 3);
    result.add(new ArrayList<>(temp));

The result is [[1, 3], [1, 3]], but I think it should be [[1, 2], [1, 3]], why?

Follow comments

temp.add(1);  /aaded 1 
temp.add(2);  / added 2
result.add(temp);
temp.remove(temp.size() - 1); // removed index 1 that i.e removed 2
temp.add(1, 3);   // added 3 at the index 1 again.  now it is 1,3 
result.add(new ArrayList<>(temp));  // And you are added a new array list again with temp 

And if I understand correctly, you misunderstood the logic at

 temp.add(1, 3);

That means you are telling add the value 3 at the index 1 in the list temp .

Output is self explanatory.

Misconceptions

1.) temp.remove(temp.size() - 1);

This removes last element from temp list and since temp list is being referred inside result so it get referenced there as well.

2.) temp.add(1, 3);

It will add the value 3 at the index 1 in the temp list .

public static void main(String[] args) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<>();

        ArrayList<Integer> temp = new ArrayList<>();
        temp.add(1);
        temp.add(2);
        System.out.println("Temp is : " + temp);

        result.add(temp);
        System.out.println("Result is : " + result);

        temp.remove(temp.size() - 1);
        System.out.println("Temp is : " + result);
        System.out.println("Result is : " + result);

        temp.add(1, 3);
        System.out.println("Temp is : " + temp);

        result.add(new ArrayList<>(temp));
        System.out.println("Result is : " + result);
    }

output

Temp is : [1, 2]
Result is : [[1, 2]]
Temp is : [[1]]
Result is : [[1]]
Temp is : [1, 3]
Result is : [[1, 3], [1, 3]]

If you update temp directly then all the references pointing to that list is also updated (in your case result list 1st index), that's why you are getting [[1, 3], [1, 3]] output.

You can use below code.

ArrayList<ArrayList<Integer>> result = new ArrayList<>();
ArrayList<Integer> temp = new ArrayList<>();
temp.add(1);  //added 1 
temp.add(2);  // added 2
result.add(temp);

// creating new object and populating it with the values of temp.
ArrayList<Integer> temp1 = new ArrayList<>(temp);

// or you can reinitialize temp with its previous values and then use it as you have done in your code.
// temp = new ArrayList<>(temp); 

temp1.remove(temp1.size() - 1);
temp1.add(1, 3); 
result.add(temp1);

System.out.println(result);

Output:

[[1, 2], [1, 3]]

The problem is that you do not copy the values of temp into result but you are just giving a reference to temp.

By changing the reference you change the result.

To solve the problem, try this:

public void test1() {
    ArrayList<ArrayList<Integer>> result = new ArrayList<>();
    ArrayList<Integer> temp = new ArrayList<>();
    ArrayList<Integer> temp2 = new ArrayList<>();
    temp.add(1);
    temp.add(2);
    result.add(new ArrayList<>(temp));
    temp.remove(temp.size() - 1);
    temp.add(1, 3);
    result.add(new ArrayList<>(temp));
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM