2013-03-31 3 views
1

죄송합니다. 제목이 이해하기 쉽지 않지만 영어가 도움이되지 않습니다. 필자는 자바에서 새로운 프로그래머이며 매개 변수의 작동 방식을 읽었음에도 실제로 어떤 일이 일어나고 있는지 이해하지 못합니다. 어떻게됩니까개체를 변경하면 현재 개체도 변경됩니다.

sudokuBoard alter = new sudokuBoard(); 
this.createRandomSudokuBoard(); 
alter.setBoardFromArray(this.getBoard().clone()); 

(...) 

for(int i = 0; i < 81; i++) { 
    alter.clearCell(positionListonX[i], positionListonY[i]); <<<<<<<<<<<<< Here 
    if(alter.numberOfSolutions(2) < 2) { 
     this.clearCell(positionListonX[i], positionListonY[i]); 
     alter.setBoardFromArray(this.getBoard().clone()); 
    } else { 
     alter.setBoardFromArray(this.getBoard().clone()); 
    } 
} 

는 표시된 라인에서,이 방법도 현재 오브젝트 (본)를 수정한다 alter 오브젝트 clearCell 호출한다는 것이다. 마지막 절망적 인 시도로, 나는 당신이 볼 수 있듯이 clone() 메쏘드로 그것을 해결하려고 시도했으나 작동하지 않았다.

무슨 일 이니? 내가 뭘 놓치고 있니? 고마워요.

답변

1

SudokuBoardclone()을 구현하지 않은 경우 clone()Object에 정의되어있어 개체의 전체 복사본을 수행하지 못할 수 있습니다. 자세한 내용은 Deep Copy을 참조하십시오. 당신이 실제로 alter에서 보드의 완전히 별도의 인스턴스를 원하는 경우에, 당신은 같은 것을 할 필요가있을 것이다 : 당신의 positionListonXpositionListonY 배열의 값이 기본 유형이없는 경우 있음을

class SudokuBoard 
{ 
    public void setBoard(SudokuBoard other) 
    { 
     for(int i = 0; i < 81; i++) 
     { 
      this.positionListonX[i] = other.positionListonX[i]; 
      this.positionListonY[i] = other.positionListonY[i]; 
     } 
     // Copy any other properties 
    } 
} 

참고, 당신은 또한거야 그것들의 깊은 사본이 필요합니다. 이것은 효과적으로 복사 생성자이지만 SudokuBoard의 나머지 부분을 알지 못하기 때문에 그 서명 (public SudokuBoard(SudokuBoard other))을 제공하지 않았습니다.

SudokuBoard 클래스에 정의 된 메서드 서명을 더 많이 볼 수 있으므로 사용할 수있는 메서드를 알 수 있고 메서드가 수행 할 수있는 것을 이해할 수 있습니다.

편집

class SudokuBoard 
{ 
    public void setBoardFromArray(int[][] otherBoard) 
    { 
     for(int i = 0; i < otherBoard.length; i++) 
     { 
      // Clone the arrays that actually have the data 
      this.board[i] = otherBoard[i].clone(); 
     } 
    } 
} 
+0

는 지금은 더 나은 이해 대단히 감사합니다. 클래스의 코드는 http://pastebin.com/fjCP7DQL에 있습니다. 문서화되지 않았고 완료되지 않았습니다. – Adelaiglesia

+0

변경 사항이 좋을 때 복사본을 유지하고 this.board 만 변경하려고하는 것 같습니다. setBoardFromArray를 업데이트하여 배열을 할당하는 대신 요소 별 복사를 수행하는 것이 좋습니다. 데이터 자체가 아니라 다른 배열에 대한 참조를 복제했기 때문에 '복제본'호출이 작동하지 않는다고 생각합니다. 내가 원하는대로 할 수있는'setBoardToArray'에 대한 제 편집을보십시오. –

관련 문제