2015-03-09 4 views
0

Я создал класс, который можно унаследовать для создания стека и очереди с помощью LinkedLists. Я прошел все тесты JUnit, кроме равных , Я до сих пор не знаю, почему это не работает.Сравнение исходного объекта с стеком/очередью - метод overriding equals()

@Override public boolean equals(Object o) { 

    if(o == null) return false; 
    if(o == this) return true; 


    if(!(o instanceof PushPop)) return false; 
    PushPop test1= this; 
    PushPop test = (PushPop)o; 
    while(!test.isEmpty() && !test1.isEmpty()){ 
     if(test1.pop() != test.pop()) return false; 
    } 
    return true; 
} 

Тест посылает сообщение об ошибке, когда утверждение это сравнение значений, в частности, всякий раз, когда стек/очередь имеет дополнительное значение, чем второй.

+1

Вы изменяете свои стеки во время 'equals'. Фактически вы очищаете их. Вы видите, как это может быть проблемой? –

+0

Я изменяю стеки, поскольку мне нужно сравнить все объекты, и у меня нет другого пути, кроме как вытащить каждый элемент и сравнить его с другим стеклом, который был вставлен. Я должен проверить, являются ли элементы одинаковыми и в том же порядке, хотя у вас есть точка. Я должен создать копию оригинала, чтобы он не изменялся. Я отредактировал код, чтобы добавить копию структуры данных. –

+0

Посмотрите, исправляет ли ваша проблема ... Я вижу, что вы выполняете один и тот же тест дважды, и он просто возвращает «истина» второй раз, потому что они оба пустые –

ответ

0

ОК, я Отыскав свою проблему:

В тесте, вы делаете следующее [взято из комментария]

stack.push(i); 
Assert.assertFalse(stack.equals(stack2)); 
stack2.push(i); 
Assert.assertTrue(stack.equals(stack2)); 

Это кажется разумным. Тем не менее, equals очищает оба стека, поэтому, когда вы pushi на stack2, он больше не является равным stack.

Следовательно, ваша ошибка.

Решение: Не изменяйте свой объект в методе equals.

Я хотел бы предложить клонирование или сравнения независимо от вашей основной структуры данных (например, если вы используете узлы, имеющие Node реализации equals).

+0

Я не должен модифицировать Тест, это выдал мой учитель. Я заметил, что он отлично работает, когда я удаляю эту строку ... Итак, в конце концов, тесты имеют ошибку или у меня все еще есть ошибка? –

+0

Я не предлагаю модифицировать тест. Вам нужно исправить ваш 'equals' –

+0

Спасибо, я уже исправил его. Я добавил еще одно условие: он проверял размер стека и сравнивал его с размером второго стека. Казалось, это исправить. Спасибо за ваш вклад, это помогло мне просмотреть мой код. В конце концов, я не должен программировать в 1 час ночи. –

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