自制堆栈等于方法

时间:2014-09-27 01:44:10

标签: java stack

对于我的数据结构类,我们必须创建自己的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; 
    }

}

我们的Stack几乎是一个ArrayList,我们也在我们的类中构建。问题是,我无法将Object对象添加到堆栈中,因为它不是可迭代的东西(可以迭代)。有一个更好的方法吗?我认为get()可以工作,因为我创建的Stack是一个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()时,传入equals()方法的原始列表中的值(成为otherStack的值)我们也会从原始列表中弹出,导致错误的结果。没有添加任何其他方法,有没有更好的方法来做到这一点?我试图尽可能贴近我教授设定的公式,所以我不想添加任何额外的字段或方法。 任何和所有帮助表示赞赏

1 个答案:

答案 0 :(得分:2)

equals方法不应该创建任何东西,甚至不是临时对象。不是创建新的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指定的合同时,您都需要执行此操作。< / p>