2014-09-27 2 views
1

Для моего класса структур данных мы должны создать собственный тип данных Stack и реализацию для него как проекта. Проблема, с которой я сталкиваюсь, заключается в том, что профессор попросил нас реализовать метод equals (Object object). Вот что я до сих пор ...Метод Homemade Stack Equals

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 в стек, потому что это не то, что iteratable (возможно для повторения). Есть лучший способ сделать это? Я бы подумал, что get() будет работать, поскольку Stack я создаю ArrayList, но всякий раз, когда я использую get() на otherStack, он не может найти метод. У меня было временное решение, когда я попробовал лить объект как стек (я надеюсь, что я использую правильную терминологию). Это выглядело примерно так

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), который был принят в равных() метод, который мы 'также выскочил из исходного списка, что привело к некорректному результату. Есть ли лучший способ сделать это без добавления каких-либо других методов? Я стараюсь держаться как можно ближе к формуле, установленной моим профессором, поэтому я не хочу добавлять какие-либо дополнительные поля или методы. оценили и помогли.

+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.

+0

Единственная часть этого, которая меня смущает, это otherStack.values.size() ;. isString, вызывающий size() через значения? – SteakStyles

+0

@SteakStyles Все это делает проверку того, что другой стек имеет столько же элементов, сколько этот стек. – dasblinkenlight

Смежные вопросы