2014-01-04 5 views
0

У меня есть 2D-массив под названием «playField». Прежде чем произойдут какие-либо изменения, я создаю 2D-массив tempField и задаю tempField = playField.Что вызывает изменение в моем 2D-массиве?

После нескольких модификаций, которые все работают, я добраться до этой точки в коде:

else { 
//at this point both playingField and tempField are unchanged still 
    boundsNormal = bounds.OutOfBounds(move.MovePlayer(playingField,trekker, direction, rowT, colT)); 
    if(boundsNormal == true){ 
//for some reason, at this point, tempField gets reassigned to the new playingField (which I'm still not sure why *THAT* changes) 
     playingField = tempField; 

MovePlayer это метод, который изменяет массив 2D он принимает (в данном случае, playingField), и OutOfBounds возвращается true или false, учитывая массив.

Возможно, я понимаю, почему меняется играField, но не знаю, почему tempField должен испытывать какие-либо изменения после инициализации переменной boundsNormal.

+4

Обратите внимание, что 'if (boundsNormal == true)' может быть упрощено до 'if (boundsNormal)' –

+1

как вы определили 'tempField'? Похоже, вы создаете ссылку на 'playField' вместо создания другого 2D-массива. –

+1

@Akshat Singhal - звучит так, как будто вы согласны с Робин Грин; Я не знал, что я только ссылаюсь, я уверен, что инициализация массива с другим массивом была такой же, как и копирование. Спасибо за ваш вклад. – Jona

ответ

2

Я создаю 2D-массив tempField и задаю tempField = playField.

То, что вы говорите, не имеет смысла. Вы делаете массив переменной под названием tempField, но если вы делаете

tempField = playingField 

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

Чтобы избежать этого, вы можете использовать System.arrayCopy вместо =. Однако для 2-мерного массива немного сложнее «глубоко скопировать» его, потому что у вас есть массив массивов.

(Примечание: в общем случае, когда объекты изменяемы, вам может понадобиться «глубокая копия» или «глубокий клон» вместо использования =, чтобы избежать этой проблемы. Массивы - всего лишь один пример этого общего правила.)

+0

Во-первых, спасибо за ваш ответ. Во-вторых - что, если я создал tempField, перейдя через каждый элемент в playField и назначив каждую ячейку в temp такой же, как соответствующая ячейка playField; будет ли это работать, или просто создать ссылку? – Jona

+0

Всё зависит. Если ячейки содержат примитивные типы, нет, это не создаст ссылок, иначе да, это создаст ссылки. Но ссылки на неизменяемые типы (например, String) безопасны. –

+0

yup, это 2D массив строк. Огромное спасибо! – Jona

0
playingField = tempField; 

Эта строка кода не копирует ваш массив, она копирует ссылку. После этого назначения оба playingField и tempField представляют тот же массив в памяти (массив, представленный playField, до того, как это, вероятно, ждет сбора мусора.) Поэтому, если после этого вы измените что-либо в массиве, представленном playingField, изменения также будут быть видимым в tempField, так как это в основном тот же массив (не скопированный массив, тот же массив с двумя именами).

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