【问题标题】:Comparing raw object with a Stack/Queue - Overriding equals() method将原始对象与堆栈/队列进行比较 - 覆盖 equals() 方法
【发布时间】:2015-03-09 05:13:21
【问题描述】:

我创建了一个类,它可以被继承以使用 LinkedLists 创建一个 Stack 和一个 Queue,我已经通过了所有 JUnit 测试,除了 equals 测试,我仍然不知道为什么它不起作用。

@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;
}

测试在比较值时发出断言错误,特别是当堆栈/队列的值比第二个值多时。

【问题讨论】:

  • 您正在equals 期间修改您的堆栈。事实上,你正在清除它们。你知道这怎么可能是个问题吗?
  • 我正在修改堆栈,因为我需要比较所有对象,除了弹出每个元素并将其与其他堆栈弹出元素进行比较之外,我别无他法。我应该检查项目是否相同且顺序相同,尽管您确实有一点。我应该创建一个原始副本,这样它就不会被修改。我已经编辑了代码以添加数据结构的副本。
  • 看看这是否能解决你的问题...我看到你运行了两次相同的测试,第二次返回true,因为它们都是空的
  • 它没有工作,它仍然发出一个 AssertionError。原谅我?我不明白你在说哪些测试
  • 对不起,我想我不是很清楚。我的意思是“我想你在跑步……”

标签: java data-structures stack queue


【解决方案1】:

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

在您的测试中,您执行以下操作 [取自评论]

stack.push(i);
Assert.assertFalse(stack.equals(stack2));
stack2.push(i);
Assert.assertTrue(stack.equals(stack2));

这似乎是合理的。但是,equals 会清除两个堆栈,因此当您将push i 放到stack2 上时,它不再等于现在为空的stack

因此你的错误。

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

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

【讨论】:

  • 我不应该修改测试,它是我的老师给出的。我确实注意到每当我删除该行时它运行良好......所以最后测试有错误还是我仍然有错误?
  • 我不建议修改测试。你需要修复你的equals
  • 谢谢,我已经修好了。我添加了另一个条件,它检查堆栈的大小并将其与第二个堆栈的大小进行比较。这似乎解决了它。感谢您的输入,它帮助我检查了我的代码。最后,我不应该在凌晨 1 点编程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2019-05-04
  • 2013-02-17
  • 2019-05-28
相关资源
最近更新 更多