2014-10-19 51 views
0

我無法跟蹤堆棧中的節點。我的節點包含一個2d int數組,其中包含數字0-20以及另一個整數,用於衡量進入當前節點狀態(2d int數組)的開銷。堆棧變量和.contains(對象o)

目前我不知道如何跟蹤如果我的堆棧包含一個節點,我想跳過,因爲它已經在堆棧中或之前已經彈出,所以我避免重複相同的比較具有完全相同的狀態+成本。

如果q是我的籌碼和N1是我當前的節點我只是突然,爲什麼不會

q.contains(n1); 

還回是真的嗎?

我也試圖使這對每個節點創建一個字符串

防爆

1 2 4 
5 3 6 
0 7 8 

創建字符串「一個ArrayList 1,2,4,5,3,6,0,7,8 「。如果我將這個字符串添加到數組列表,我使用 aList.contains(stringKey);永不返回真實?

我想我必須做一些對象,因爲contains()需要傳遞一個對象,而我不是100%確定如何做到這一點。

回答

1

如果在列表中找到obj,則任何列表的contains(obj)都會返回true。它將列表中的每個object與您使用equals()方法提供的obj進行比較。因此,您需要覆蓋您正在使用的對象的equals()方法。

例子:

class MyObj { 
    int a; 
    char b; 

    MyObj(int a, char b) { 
     this.a = a; this.b = b; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if(obj instanceof MyObj){ 
      MyObj myobj = (MyObj) obj; 
      if(myobj.a == a && myobj.b == b){ 
       return true; 
      } 
     } 
     return false; 
    } 
} 

現在,它可以在任何List被用作這裏:

ArrayList<MyObj> list = new ArrayList<>(); 
MyObj obj = new MyObj(3, 'b'); 
list.add(obj); 
System.out.println(list.contains(obj)); 
System.out.println(list.contains(new MyObj(3, 'b'))); 

輸出:

true 
true 

根據我們應該重寫好的設計模式當我們決定覆蓋equals()時也是如此。

+0

謝謝,有道理。只有一個問題,如果我要比較一個2d int數組,我是否需要檢查每個點以進行比較還是我可以像(a和b是int [] [])obj.a == obj.b? – George 2014-10-19 23:08:07

+0

你將不得不使用每個元素。爲此使用'Arrays.equals(...)',這比手動更有效。 – afzalex 2014-10-19 23:12:13

+0

不要忘記,如果你重寫equals,也可以重寫hashCode – Joeblade 2014-10-19 23:48:37