0

我无法跟踪堆栈中的节点。我的节点包含一个 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% 确定如何做到这一点。

4

1 回答 1

1

如果在其列表中找到任何contains(obj)列表,则返回。它使用您提供的方法检查列表中的每个。所以你需要重写你正在使用的对象的方法。trueobjobjectobjequals()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()

于 2014-10-19T22:53:06.360 回答