2013-05-11 3 views
0

У меня есть класс школы:действует и эффективная реализация хэш-код()

public class School{ 

    private int noOfTeachers; 
    private int noOfStudents; 

    //setters and getters.... 

    public boolean equals(Object that){ 
    //instance of check.. 
     return (this.noOfTeachers == ((School)that).noOfTeachers || 
       this.noOfStudents== ((School)that).noOfStudents); 
    } 


    public int hashCode(){ 
     //What goes in here??? o.O 
    } 
} 

Как я должен приступить к реализации hashCode для этого класса? Я не могу думать о стратегии, которая будет включать в себя как noOfTeachers, так и noOfStudents для расчета хэша. Скорее noOfTeachers и noOfStudents комбинация, кажется, нарушает договор между equals и hashCode.

+7

Вы правы - любая проверка равенства с «или» будет нарушать транзитивность. –

+1

Я не понимаю, как вы можете. Вы могли бы, конечно, «вернуться 1», но это будет бесполезно, так как ваш класс не будет работать в «HashMap's» и «HashSet's». Для чего вы используете этот метод 'equals'? –

+0

Я думаю, что лучше всего оставить 'equals' и' hashCode' самостоятельно и создать метод, который проверяет это. Причиной переопределения этих методов является то, что 'Collection' соблюдает равенство, используя ваш метод 'equals', а не по умолчанию, который использует' == '. –

ответ

2

Вы не найдете никаких подходящих вариантов для своего класса hashCode(), что послужит вашим потребностям! Поскольку ваш метод equals использует OR в его свойствах вашего класса. Использование OR в методе equals возвращает true для более чем одного состояния любого объекта.

Таким образом, используя уникальное возвращаемое значение hashCode(), вы, безусловно, не можете представлять несколько состояний! И более того, вы должны знать, что hashCode() должен возвращать уникальное значение для объекта. Как возврат к нему нескольких значений, приводит к двусмысленности (и наносит вред определенности), чтобы поместить объект в любую карту. Потому что это является нарушением предположения «Единственность ключей карты».

+2

Это, конечно, не работает. OP хочет метод 'equals' с ** или **. –

+0

, если два объекта равны в соответствии с методом 'equals', тогда вызов метода hashCode на каждом из двух объектов должен создать ** тот же ** результат – Anirudha

+0

@BoristheSpider, я прошу вас увидеть ответ сейчас, снова, спасибо ! –