2012-03-19 84 views
0

我想寫一個代碼來獲得從(0,0)開始的猴子可訪問的點集(x,y),使得每個點滿足| x | + | y | < _limitSum。我寫了下面的代碼,並使用了座標類型(此處未顯示)的成員的靜態HashSet,並編寫了遞歸方法AccessPositiveQuadrantCoordinates。但問題在於,通過遞歸調用傳遞的HashSet成員並不反映先前調用中添加的座標成員。任何人都可以幫助我如何傳遞對象引用來實現這一點嗎?有沒有其他方式可以解決這個問題?如何寫一個使用靜態變量的遞歸函數

public class MonkeyCoordinates { 
public static HashSet<Coordinate> _accessibleCoordinates = null; 
private int _limitSum; 
public MonkeyCoordinates(int limitSum) { 
    _limitSum = limitSum; 
    if (_accessibleCoordinates == null) 
     _accessibleCoordinates = new HashSet<Coordinate>(); 
} 
public int GetAccessibleCoordinateCount() { 
    _accessibleCoordinates.clear(); 
    Coordinate start = new Coordinate(0,0); 
    AccessPositiveQuadrantCoordinates(start); 
    return (_accessibleCoordinates.size() * 4); 
} 
private void AccessPositiveQuadrantCoordinates(Coordinate current) { 
    if (current.getCoordinateSum() > _limitSum) { return; } 
    System.out.println("debug: The set _accessibleCoordinates is "); 
    for (Coordinate c : _accessibleCoordinates) { 
     System.out.println("debug:" + c.getXValue() + " " + c.getYValue()); 
    } 

    if (!_accessibleCoordinates.contains(current)) { _accessibleCoordinates.add(current); } 
    AccessPositiveQuadrantCoordinates(current.Move(Coordinate.Direction.East)); 
    AccessPositiveQuadrantCoordinates(current.Move(Coordinate.Direction.North)); 
} 

我會指出所有可以接受的答案。

感謝進取, 索姆納特

+0

'使用靜態變量'與您的問題完全沒有關係。 – EJP 2012-03-19 09:09:13

+0

@EJP:好的。但是如果我們需要一組點來代替Count,那麼非靜態變量如何能夠達到目的呢?你能簡要介紹一下嗎? – somnathchakrabarti 2012-03-19 09:29:21

+0

使用實例變量。如果你的方法是靜態的,你只需要靜態變量。他們不是。 – EJP 2012-03-19 09:30:48

回答

1

我看不出有任何問題,使得現場_accessibleCoordinates非靜態

,你應該知道的HashSet並不保證相同的迭代順序每次,你可以更好地使用一個LinkedList爲目的...

和有關按引用傳遞,我發現這個職位是非常有用的

java - pass by value - SO link

從你在做什麼你會在每次遞歸調用正確更新_accessibleCoordinates。

+0

是的,您是對的。但是我打印HashSet中的所有元素並且迭代順序是否太重要?您能否介紹一下非靜態字段如何工作?你可以假設我們需要的是所有點的集合,而不僅僅是Count。 – somnathchakrabarti 2012-03-19 09:27:57

2

但問題是整個遞歸調用通過HashSet的成員不反映協調會員在以前的調用增加。

我認爲這是不太可能的。我認爲您的Coordinate課程更有可能不會覆蓋equalshashCode,這就是爲什麼該設置無法「查找」這些值。另外,使用這樣的靜態變量對我來說似乎是一個非常糟糕的主意 - 爲什麼不創建GetAccessibleCoordinateCount()中的集合並將引用傳遞給AccessPositiveQuadrantCoordinates,而該參考又可以繼續在遞歸中傳遞給它電話?

(如另一個不談,我會強烈建議你開始下面的Java命名約定...)

+0

謝謝。但即使我將HashSet添加到GetAccessibleCoordinateCount()中,我仍然必須傳遞HashSet _accessibleCoordinates作爲參考。在Java中傳遞對象作爲參考的方式是什麼? – somnathchakrabarti 2012-03-19 09:21:34

+0

@somnathchakrabarti:Java中表達式的值總是*引用或原始值。你永遠不能傳遞*實際對象*。你不能通過* reference來傳遞參數,但是如果你通過值傳遞一個引用類型變量,那麼你總是傳遞一個引用 - 所以對這個對象的任何修改對於調用者都是可見的。 (修改參數變量本身,例如使其引用另一個對象,*不會影響參數。) – 2012-03-19 09:23:55

相關問題