2014-09-27 64 views
1

对于我的数据结构类,我们必须创建自己的堆栈数据类型及其作为项目的实现。我遇到的问题是当教授要求我们实现一个equals(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()会起作用,因为我创建的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,在原来的列表中的值(即变成otherStack一)已传递到equals()方法,我们'也从原始列表中弹出,导致错误的结果。有没有更好的方式来做到这一点,而无需添加任何其他方法?我尽量贴近教授设定的公式,所以我不想添加任何额外的字段或方法。 任何和所有的帮助表示赞赏

+0

栈的内部实现是你的列表'values',那么为什么不在它们的'values'的平等上定义两个栈的相等性? – 2014-09-27 01:48:35

回答

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指定的合同时执行此操作。

+0

这使我困惑的唯一部分是otherStack.values.size();. otherStack通过值调用size()? – SteakStyles 2014-09-27 02:45:04

+0

@SteakStyles所有这一切都是检查其他堆栈是否具有与此堆栈一样多的元素。 – dasblinkenlight 2014-09-27 08:09:56