Java 比较原始对象与堆栈/队列重写equals()方法

Java 比较原始对象与堆栈/队列重写equals()方法,java,data-structures,stack,queue,Java,Data Structures,Stack,Queue,我已经创建了一个类,它可以被继承来使用LinkedList创建堆栈和队列,我已经通过了所有JUnit测试,除了equals one,我仍然不知道为什么它不工作 @Override public boolean equals(Object o) { if( o == null) return false; if(o == this) return true; if(!(o instanceof PushPop)) return false; PushPop t

我已经创建了一个类,它可以被继承来使用LinkedList创建堆栈和队列,我已经通过了所有JUnit测试,除了equals one,我仍然不知道为什么它不工作

@Override public boolean equals(Object o) {

    if( o == null) return false;
    if(o == this) return true;


    if(!(o instanceof PushPop)) return false;
    PushPop test1= this;
    PushPop test = (PushPop)o;
    while(!test.isEmpty() && !test1.isEmpty()){
        if(test1.pop() != test.pop()) return false;
    }
    return true;
}

每当比较值时,测试就会发出断言错误,特别是当堆栈/队列的值大于第二个值时

好的,我找到了您的问题:

在您的测试中,您执行以下操作[摘自注释]

stack.push(i);
Assert.assertFalse(stack.equals(stack2));
stack2.push(i);
Assert.assertTrue(stack.equals(stack2));
这似乎是合理的。但是,
equals
清除两个堆栈,因此当您
i
推到
堆栈2
上时,它不再等于现在为空的
堆栈

这就是你的错误

解决方案:不要在
等于
方法中修改对象。


我建议克隆或比较任何底层数据结构(例如,如果您使用节点,则使用
节点
实现
等于
)。

您在
等于
期间修改堆栈。事实上,你正在清理它们。你知道这怎么会是个问题吗?我正在修改堆栈,因为我需要比较所有的对象,除了弹出每个元素并将其与其他堆栈弹出的元素进行比较外,没有其他方法。我应该检查这些项目是否相同,顺序是否相同,尽管你有一个观点。我应该创建一份原件的副本,这样它就不会被修改。我已编辑代码以添加数据结构的副本。请查看这是否解决了您的问题。。。我看到您运行了两次相同的测试,第二次返回
true
,因为它们都是空的。它不起作用,但仍在发送断言错误。打扰一下?我不明白你说的是哪种测试对不起,我想我不太清楚。我的意思是“我想象你在运行…”我不应该修改测试,它是由我的老师给出的。我确实注意到每当我删除那一行时它运行良好。。。所以最后测试有错误还是我仍然有错误?我不是建议修改测试。你需要修正你的
等于
谢谢,我已经修正了。我添加了另一个条件,它检查堆栈的大小,并将其与第二个堆栈的大小进行比较。这似乎解决了问题。感谢您的输入,它帮助我检查了我的代码。最后,我不应该在凌晨1点编程。