堆栈变量和.contains(对象o)

时间:2014-10-19 22:45:16

标签: java stack contain

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

1 个答案:

答案 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()