2012-01-31 5 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 자체를 수정하는 것입니다 :

여기 내 코드입니다. 타일 ​​배열의 새로운 인스턴스를 만든 다음 보냈습니다. 우리는 많은 것을 말할 수 없다

CopyTilesArrays (tilesArray, tempTilesArrayToSend); 

에서 수행되는 것을 보지 않고

+0

가하셨습니까 " * SwapTilesPositions() * 함수 안에 "? – erickson

+1

'CopyTileArrays()'함수를 게시해야합니다. 첫 번째 인수를 반환하고 두 번째 인수를 버려야합니다. – erickson

+0

아마도'CopyTilesArrays' 함수가 얕은 복사본을 만듭니다. – Jivings

답변

1

.

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]] 

당신은 지금 깊은 복사하지 않고, 원래 A가 너무 영향을받습니다로는 A를 수정하는 경우 :

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

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