java - 堆栈变量和 .contains(Object o)

标签 java stack contain

我无法跟踪堆栈中的节点。我的节点包含一个 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/

相关文章:

javascript - JS 检查页面/内容是否不包含

java - 如何将数组列表从servlet传递到JSP?

单例中类字段和方法的Java顺序

java - SiddhiQL 中的语法错误,输入时没有可行的替代方案

java - 错误: Type Queue Does Not Take Parameter - What's the difference between Queues and Priority Queues?

c++ - 为什么在尝试将新节点插入列表时出现错误

c++ - 以下程序中创建的用于 map 初始化的临时变量在哪里

jquery - 如何使用:contains() Selector to determine the object has a certain keyword when it is clicked?

java - 从 AccessDB 中提取数据时出现的问题

Java检查两个矩形是否在任何点重叠