对于我的数据结构类,我们必须创建自己的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的值)我们也会从原始列表中弹出,导致错误的结果。没有添加任何其他方法,有没有更好的方法来做到这一点?我试图尽可能贴近我教授设定的公式,所以我不想添加任何额外的字段或方法。 任何和所有帮助表示赞赏
答案 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>