我无法跟踪堆栈中的节点。我的节点包含一个2d int数组,其中包含数字0-20以及另一个整数,用于衡量到达当前节点状态的成本(2d int数组)。
目前我无法弄清楚如何跟踪我的堆栈是否包含我希望跳过的节点,因为它已经在堆栈中或者之前已经弹出,因此我避免在具有完全相同状态的节点上重复相同的比较+成本。
如果q是我的堆栈而n1是我刚刚弹出的当前节点,为什么不会
q.contains(n1);
永远回归真实吗?
我还尝试创建一个ArrayList,为每个节点创建一个字符串
实施例
1 2 4
5 3 6
0 7 8
创建字符串“1,2,4,5,3,6,0,7,8,”。如果我将此字符串添加到数组列表,我使用 aList.contains(stringKey);从来没有回归真实?
我认为我必须对某个对象做一些事情因为contains()需要传递一个对象,而且我不能100%确定如何做到这一点。
答案 0 :(得分:1)
如果列表中找到contains(obj)
,则任何列表的true
都会返回obj
。它会使用您使用object
方法提供的obj
检查列表中的每个equals()
。因此,您需要覆盖正在使用的对象的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
根据良好的设计模式,当我们决定覆盖hashCode()
时,我们也应覆盖equals()
。