2016-09-21 2 views
-4

Я хочу получить последний элемент 2D-массива, называемый точкой, и добавить этот последний элемент обратно в список как новый элемент с обновленным значением Y и тем же значением X. Таким образом, в основном, что я делаю, получается последний элемент точечного 2D-массива, добавьте его в конец точечного 2D-массива, но с изменением значения y на него. Но проблема в том, что когда я изменяю значение y, он также изменяет значение элемента, из которого была получена информация.Почему изменение значения элемента в ArrayList меняет значение другого?

List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values= new ArrayList<Integer>(); 
    values.add(1);//x 
    values.add(2);//y 

    point.add(values); 
    point.add(point.get(point.size()-1)); 
    point.get(0).set(1, 200); 
    System.out.println(point); 

выход: [[1, 200], [1, 200]] Ожидаемый результат: [[1, 2], [1, 200]]

+1

Показать код, показать ожидаемый и текущий выход ... –

+1

Просьба уточнить больше. Показать код. –

+0

http://stackoverflow.com/help/how-to-ask http://stackoverflow.com/help/mcve –

ответ

0
point.add(point.get(point.size()-1)); 

не делать то, что вы думаете. Он добавляет reference ко второму последнему элементу в arraylist до последнего. Поэтому, когда вы пытаетесь отобразить значение из последнего элемента, он фактически извлекает данные со второго последнего values в point и отображает это. Чтобы изменить данные отдельно, замените строку я указал, с этим:

point.add(new ArrayList<Integer>(values)); 

Таким образом, вы должны отдельно добавить две копии values в конце point.

point.get(0).set(1, 200); //0 denotes first element. not last 

даст вам этот вывод:

[[1, 200], [1, 2]] 

это должно быть заменен

point.get(point.size() - 1).set(1, 200); //last element 

исправляющие эти две ошибки даст вам ожидаемый результат.

-1

При добавлении второй вход в с

point.add(point.get(point.size()-1)); 

Вы фактически добавляете ссылку на первый массив. Поэтому естественно, что они будут одинаковыми, а также соответственно изменятся.

Вам нужно будет создать новый объект как копию для того, чтобы быть уникальным, например,

point.add(new ArrayList<Integer>(point.get(point.size()-1))); 
0

Попробуйте это

List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values = new ArrayList<Integer>(); 
    values.add(1);// x 
    values.add(2);// y 

    point.add(values); 
    List<Integer> secondList = new ArrayList<Integer>(point.get(point 
      .size() - 1)); 
    secondList.set(1, 200); 
    point.add(secondList); 
    System.out.println(point); 
0
List<List<Integer>> point = new ArrayList<List<Integer>>(); 
    List<Integer> values= new ArrayList<Integer>(); 
    values.add(1);//x 
    values.add(2);//y 

    point.add(values); 

    List<Integer> values2= new ArrayList<Integer>(); 
    values2.add(point.get(point.size()-1).get(0)); 
    values2.add(point.get(point.size()-1).get(1)); 

    point.add(values2); 
    point.get(1).set(1, 200); 
    System.out.println(point); 

Это будет работать нормально. Проблема возникла, поскольку новый элемент, добавленный в точку, имел ту же ссылку, что и исходный элемент. Таким образом, сделанные изменения будут применены к обоим элементам.

Смежные вопросы