2013-03-21 82 views
0

更新的對象我有一個要求我們用遞歸..問題是我的布爾檢查可用空間應該更新參照當前位置,這是不是一個數獨謎題解決。什麼會造成這種情況?通過引用(Suduko)

public boolean solve() 
{ 
    Coordinate current = new Coordinate(); 

    if (findEmptyGridSlot(current)) { // THE ERROR IS HERE ********** THIS IS SHOWING (0,0) STILL ****************** 

     for (int number = 1; number <= 9; number++) 
      if (canPlaceNumber(current, number)) { 
       grid[current.getRow()][current.getColumn()] = number; 

       if (solve()) 
        return true; 

       grid[current.getRow()][current.getColumn()] = 0; 
      } return false; 
    }else 
     return true; 

} 

private boolean findEmptyGridSlot(Coordinate coordinate) 
{ 
    boolean found = false; 

    try{ 
     while (!found) 
     { 
      if (grid[coordinate.getRow()][coordinate.getColumn()] == 0) 
       found = true; 
      else 
       coordinate = coordinate.next(); // *****This is supposed to update the current coordinate ****** 
     } 
    }catch (Exception e){ 
     //CREATE No Empty Cells Exception 
    } 
    return found; 
} 

public Coordinate next() 
{ 
    Coordinate result = new Coordinate(row, column); 

    result.column++; 
    if (result.column > MAX_COORDINATE) 
    { 
     result.column = MIN_COORDINATE; 
     result.row++; 
     if (result.row > MAX_COORDINATE) result = null; 
    } 

    return result; 
} 

回答

1

Java按值傳遞。這意味着你得到參考的副本協調。如果你點那個複製到一個新的對象(即coordinate = coordinate.next),你只改變了本地副本。現在,在另一方面,如果你改變對象的屬性,您的變量是指(例如coordinate.x = foocoordinate.setX(foo))這一變化將是你的方法的調用方可見。

+0

設我數着方法來感謝你!!!!!!!!! – metaDNA 2013-03-21 21:51:30

1

JPM是正確的,但我誤讀了第一次,所以我要去嘗試,以明晰

private boolean findEmptyGridSlot(Coordinate coordinate) 

基準是按值傳遞。用這些術語來思考,「座標」是一個裝有一張紙的盒子,在一張紙上寫着一個地址。座標是隻屬於這種方法的盒子,它有它自己的一張紙(許多紙片可能有相同的地址寫在它們上面)

我們可以在這個盒子裏找到'post'的東西到地址寫在紙上,但是當我們說

coordinate=something 

這意味着在一張新紙上寫上'東西'的地址。扔掉舊紙。

這個動作絲毫不影響原來的「家」是第一紙件對的地址。當我的朋友Jon更新他的地址簿時,他寫的並不重要,我仍然住在我的房子裏。因此,如果座標具有一些簡單的子結構(例如x和y),則可以「發佈」一條指令,將x和y更改爲等於「下一個」。

或者作爲一個黑客,你可以附上annother對象內部的協調,以便你可以發佈一個指令,它改變了什麼黑客類指向

測試代碼refered在註釋:

public class Test { 

    public static void main(String args[]){ 
     String bareMinObject="start"; 
     changeString(bareMinObject); 
     System.out.println(bareMinObject); //Prints start, change string has no effect 

    } 

    public static void changeString(String input){ 
     String temp="end"; 
     input=temp; 

    } 

} 
+0

當你調用findEmptyGridSlot(輸入)時,這樣做是將輸入的地址複製到一張新紙上,並給出這張紙以找到EmulateGridSlot – 2013-03-21 22:06:41

+0

我創建了一個temp變量並將其設置爲coordinate.next(),然後設置座標= temp;並解決問題! – metaDNA 2013-03-21 22:19:17

+0

你完全確定這是可行的嗎?因爲我讀它的方式實際上不應該。在我的主要答案中看到我認爲等同的代碼(因此格式正確)。 – 2013-03-21 22:32:32