2012-01-31 63 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本身。雖然我已經創建了一個tile陣列的新實例,然後發送它。

+0

您是不是要找「 * SwapTilesPositions()*函數「? – erickson 2012-01-31 20:57:40

+1

您應該發佈'CopyTileArrays()'函數。它必須返回它的第一個參數,並放棄第二個參數。 – erickson 2012-01-31 20:59:29

+0

也許'CopyTilesArrays'函數會產生一個淺拷貝? – Jivings 2012-01-31 20:59:48

回答

1

沒有看到什麼是

CopyTilesArrays (tilesArray, tempTilesArrayToSend); 

我們不能說了多少事。

請注意,在Java中,沒有傳遞值或傳遞引用,但引用的副本傳遞給方法。如果對象和數組指向相同的原始對象,則此引用的副本將指向相同的原始對象,因此如果更改了基礎/嵌入對象,原始對象將受到影響,但如果更改引用,則原始對象不會影響。

如果你想傳遞你的數組的獨立副本,你必須執行一個深層次的感覺。也許就是說,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;,但帶有深層副本,以保持原始數組中的對象不受影響。

您可以通過多種其他方式複製Tiles數組的數組。例如,您可以重新排列外部數組。與僅僅複製外部陣列,並重新安排他們

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

:如果瓷磚

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

,你可以將它們拷貝,並修改目標是。你可以複製的內部陣列,是:

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

如果現在修改A到A,原始A也會被影響,沒有一個深刻的副本:

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

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