我无法跟踪堆栈中的节点。我的节点包含一个 2d int 数组,其中包含数字 0-20 以及另一个整数,用于测量达到当前节点状态的成本(2d int 数组)。
目前我无法弄清楚如何跟踪我的堆栈是否包含我希望跳过的节点,因为它已经在堆栈中或之前已弹出,因此我避免在具有完全相同状态的节点上重复相同的比较+成本。
如果 q 是我的堆栈,n1 是我刚刚弹出的当前节点,为什么不会
q.contains(n1);
是否返回 true?
我还尝试制作一个 ArrayList,为每个节点创建一个字符串
例如
1 2 4
5 3 6
0 7 8
创建字符串“1,2,4,5,3,6,0,7,8,”。如果我将此字符串添加到数组列表中并使用 aList.contains(stringKey);永远不会返回 true?
我认为我必须对一个对象做一些事情,因为 contains() 需要传递一个对象,但我不 100% 确定如何做到这一点。
最佳答案
如果在列表中找到 obj
,任何列表的 contains(obj)
都会返回 true
。它使用您通过 equals()
方法提供的 obj
来检查列表中的每个 object
。因此,您需要重写您正在使用的对象的 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()
时,我们也应该重写hashCode()
。
关于java - 堆栈变量和 .contains(Object o),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26456230/