gpt4 book ai didi

java - 自制堆栈等于方法

转载 作者:行者123 更新时间:2023-11-30 03:44:31 24 4
gpt4 key购买 nike

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

最佳答案

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

在接下来的循环中,不要弹出另一个堆栈。不要做任何可以修改它的事情。只需浏览底层存储(即),并逐一检查元素即可。

也不要忘记重写hashCode:每次重写equals时都需要这样做,以使对象履行指定的契约java.lang.Object.

关于java - 自制堆栈等于方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070488/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com