Сделайте копию переменной и добавьте в Arraylist - PullRequest
1 голос
/ 30 марта 2012

Я работаю с двумерными значениями массивов, которые должны быть вставлены в ArrayList. Но это делается в цикле for, и значение двумерного массива-значения изменяется во время выполнения цикла, поскольку он просто используется как временная переменная (что приводит к изменению всех переменных, хранящихся в ArrayList эта переменная меняется). Поэтому, если я попытаюсь распечатать содержимое ArrayList после завершения цикла, все значения будут одинаковыми.

    for(int i = 0; i <= Counter; i++)
    {

        if(Xhavetomove >= i)
            arrayvalue[0][0] = this.Xspeed;
        else
            arrayvalue[0][0] = 0;

        if(Yhavetomove >= i)
            arrayvalue[0][1] = this.Xspeed;
        else
            arrayvalue[0][1] = 1;

        System.out.println(arrayvalue[0][1]);
        Object.movement.add(arrayvalue); 
    }

Могу ли я в любом случае сохранить само значение?

Например: в первый раз, когда цикл запускается, значение равно "5,5", но если я распечатал ArrayList, когда цикл будет выполнен, все значения превратились в "5,1".

Ответы [ 3 ]

2 голосов
/ 30 марта 2012

Проблема в том, как массив добавляется к объекту здесь.Вы не добавляете массив к объекту.Что происходит, вы добавляете адрес в место в памяти, где находится массив.Поэтому каждый раз, когда вы добавляете массив к объекту, вы каждый раз добавляете один и тот же адрес.Таким образом, каждый массив в объекте на самом деле один и тот же массив снова и снова, так как все они указывают на одно место в памяти.Поэтому, когда вы изменяете массив, он, по-видимому, меняет все их внутри объекта.

Лучше всего либо создать новый массив каждый раз в цикле, по существу создавая новое место в памяти для размещения массива, либо clone() массив, который создаст новую ссылку.

Пример:

String[] houseOfStark = {"Eddard", "Catelyn", 
                       "Robb", "Sansa", "Arya", "Bran", "Rickon"}; // Sorry Jon
String[] copyOfStark  = houseOfStark;
String[] cloneOfStark = houseOfStark.clone();

houseOfStark[1] = "Lady Catelyn";

System.out.println(houseOfStark[1]);
System.out.println(copyOfStark[1]);
System.out.println(cloneOfStark[1]);

Будет производить:

Lady Catelyn
Lady Catelyn
Catelyn

Хороший пост в блоге, объясняющий разницу

2 голосов
/ 30 марта 2012

В конце каждого добавления необходимо создать собственный объект.

Для использования клон является одним из способов.

Или всегда добавлять значения в парах, в другом.

Совершенно другим способом является использование сериализации. Это имеет смысл, когда вы не хотите вычислять эти значения, а регистрировать их. В этом случае вам нужен outputStream

Что лучше всего определяется тем, что вы хотите сделать с Object.movement

1 голос
/ 30 марта 2012

Вам нужно использовать метод массива clone(), чтобы сделать его копию:

//for example
int[][] copy = (int[][])arraySource.clone();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...