2014-10-19 70 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