自制堆叠等于方法

牛排风格

对于我的数据结构类,我们必须创建自己的Stack数据类型并将其实现为项目。我遇到的问题是,当教授要求我们实现equals(Object object)方法时。这是我到目前为止所拥有的...

package stack;
import list.*;

public class Stack <E>
implements StackADT<E>//the interface
{
    List <E> values;

    public Stack()
    {
        values = new ArrayList<E>();
    }

    public E push(E value)
    {
        values.add(value);
        return value;
    }

    public E pop()
    {
        return values.remove(values.size()-1);
    }

    public E peek()
    {
        return values.get(values.size()-1);
    }

    /** @return true only if this Stack is empty */
    public boolean isEmpty()
    {
        return (values.size()==0);
    }

    /** Clear this stack, to make it an empty stack */

    public void clear()
    {
        for (int i = 0; i < values.size()-1; i++)
        {
            pop();
        }
    }

    public String toString()
    {
        String result = "[";
        for (int i = 0; i<values.size(); i++)
        { 
            if (i == values.size()-1)
            {
                result = result + values.get(i); 
            }
            else
            {
                result = result + values.get(i) +",";
            }
        }

        result = result + "]";
        return result;
    }

    public boolean equals (Object object)
    {

        if (!(object instanceof StackADT))
        {
            return false;
        }
        StackADT <E> otherStack = new Stack<E>(); 
        for(Object o: object)//heres where i run into trouble
        {
            otherStack.push(o);
        }
        for (int i=0;i<values.size()-1;i++)
        {
            if (!(values.get(i).equals(otherStack.pop())))
            {
                return false;
            }
        }
        return true; 
    }

}

我们的堆栈几乎是一个ArrayList,我们也在类中构建了它。问题是,我无法将Object对象添加到堆栈中,因为它不是可迭代的(可以迭代)。有一个更好的方法吗?我认为get()会起作用,因为我创建的堆栈是一个ArrayList,但是每当我在otherStack上使用get()时,它都找不到该方法。当我尝试将对象转换为堆栈时,我有一个临时解决方案(希望即时通讯使用正确的术语)。看起来像这样

Stack otherStack = (Stack) object;
            for (int i=0;i<values.size()-1;i++)
        {
            if (!(values.get(i).equals(otherStack.pop())))
            {
                return false;
            }
        }
        return true; 
    }

这似乎可行,但是当在otherStack上调用pop()时,原始列表(成为otherStack的列表)中传递给equals()方法的值也从原始列表中弹出,从而导致错误的结果。有没有一种更好的方法可以在不添加任何其他方法的情况下做到这一点?我正在尝试尽可能接近教授设置的公式,所以我不想添加任何其他字段或方法。任何和所有帮助表示赞赏

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

一个equals方法不应该创建任何东西,甚至不能创建一个临时对象。而不是创建一个new otherStack而是将您选中的对象强制转换为StackADT,如下所示:

// This should be the first line of any equals() implementation:
if (object == this) {
    return true;
}
// You've got this part right: you need to check the other object's type
if (!(object instanceof StackADT)) {
    return false;
}
// Now that you know the type, cast the other object to StackADT<E>
StackADT<E> otherStack = (StackADT<E>)object;
// The next step is to check the sizes:
if (values.size() != otherStack.values.size()) {
    return false;
}
// Finally, go through the individual elements in a loop

在随后的循环中,不要弹出另一个堆栈。不要做任何可以修改它的事情。只需遍历基础存储(即values),然后逐一检查元素。

别忘了也要覆盖hashCode:每次覆盖equals该对象以实现所指定的合同时,都需要这样做java.lang.Object

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章