2012-01-31 3 views
0

Я написал функцию, которая. Проблема в том, что параметры, которые я отправляю, управляются в основной программе, хотя это не мое намерение. Я просто хочу иметь значение внутри функции, но во время работы фактическое значение в основной программе также изменяется.Значение параметра функции Java меняется

Как я могу предотвратить это?

Вот мой код:

Tiles[][] MoveRight(Tiles[][] tilesArray) { 


    Tiles[][] tempTilesArray = new Tiles[3][3]; 
    Tiles[][] tempTilesArrayToSend = new Tiles[3][3]; 

    tempTilesArrayToSend = CopyTilesArrays(tilesArray, tempTilesArrayToSend); 

    ArrayIndex zeroPos = FindZero(tilesArray); 

    Tiles zeroTile = GetTile(zeroPos, tilesArray); 

    if (zeroPos.column != 2) { 
     ArrayIndex otherPos = new ArrayIndex(zeroPos.row, 
       zeroPos.column + 1); 
     tempTilesArray = SwapTilesPositions(zeroTile, GetTile(otherPos, 
       tilesArray), tempTilesArrayToSend); 
    } 
    return tempTilesArray; 

} 

Массив Я посылаю внутри SwapPositionFunction фактически модификации самого tilesArray. Хотя я сделал новый экземпляр массива плиток, а затем отправил его.

+0

вы имели в виду " внутри * SwapTilesPositions() * function "? – erickson

+1

Вы должны опубликовать функцию 'CopyTileArrays()'. Он должен был бы вернуть свой первый аргумент и отказаться от своего второго. – erickson

+0

Возможно, функция CopyTilesArrays делает мелкую копию? – Jivings

ответ

1

Не видя, что делается в

CopyTilesArrays (tilesArray, tempTilesArrayToSend); 

мы не можем сказать много.

Обратите внимание, что в Java нет пропущенного значения или передачи по ссылке, но копия ссылки передается методам. Эта копия ссылки будет - в случае объектов и массивов - указывать на один и тот же исходный объект, поэтому, если вы измените базовый/внедренный объект, будет затронут исходный объект, но если вы измените ссылку, исходный объект не будет пострадавшие.

Если вы хотите передать независимую копию своего массива, вам нужно выполнить глубокую ocpy. Возможно, это то, что должен делать CopyTilesArrays, но, не видя этого, мы не знаем.

Обратите внимание, что есть или лучше: что может быть несколько слоев объектов, по разным причинам оставаться на поверхности, идти в ядро ​​или оставаться где-то посередине.

Например, чтобы сделать глубокую копию из массива Массив плитки, вы могли бы сделать что-то вроде этого:

public class TilesCopy { 
    Tiles[][] copyTilesArrays (Tiles[][] from, int outer, int inner) { 
     Tiles[][] to = new Tiles[outer][inner]; 
     int o = 0; 
     for (Tiles [] tiles: from) { 
      Tiles[] fresh = new Tiles [inner]; 
      int i = 0; 
      for (Tiles t : tiles) 
      { 
       fresh[i] = t.deepCopy(); 
       i++; 
      } 
      to [o] = fresh; 
      o++; 
     } 
     return to; 
    } 
} 

Обратите внимание, что в внутреннем цикле, элементы не только ссылки с fresh[i] = t;, но с глубокой копией, чтобы объекты в оригинальном массиве не были затронуты.

Вы можете скопировать массив массивов плиток несколькими способами. Например, вы можете изменить внешний массив. Если плитки были

[[A][B][C]] 
[[D][E][F]] 
[[G][H][I]] 

вы могли скопировать их и изменить цель быть:

[[G][H][I]] 
[[D][E][F]] 
[[A][B][C]] 

с простым копированием внешних массивов, и перестраивая их. И вы могли бы скопировать внутренние массивы, чтобы быть:

[[C][B][A]] 
[[F][E][D]] 
[[I][H][G]] 

Если теперь изменить А а, оригинал А будет зависеть также, без глубокой копии:

[[C][B][a]] 
[[F][E][D]] 
[[I][H][G]] 

[[a][B][C]] 
[[D][E][F]] 
[[G][H][I]] 

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

  • Нет связанных вопросов^_^