2016-03-14 3 views
0

Скажем, у меня есть класс с именем города, в котором хранятся некоторые данные о городе:Java: Эффективная структура данных для хранения объекта без «логического» дублирует

public class City { 

    String [] states; 
    String name; 
    double lat, lng; 

    //Constructors, getters/setters, etc 
} 

Я хочу, чтобы сохранить список городов без дубликаты. Теперь, как правило, было бы легко (использовать HashSet), но я буду сравнивать два объекта, которые являются технически отличными (разные адреса памяти), но те же значения String и double. Я хочу, чтобы мой HashSet рассматривал объекты с одинаковыми внутренними значениями как «эквивалентные».

Я не могу понять, как это сделать. Я переопределяю метод hashCode()? Или, возможно, я переопределяю метод equals()?

Будет что-то вроде следующей работы?

public int hashCode() { 
    return (double) name.hashCode() + lat * 100 + lng; 
} 
+3

Вы переопределяете оба символа hashCode и равны, если хотите использовать HashSet – Eran

+1

Вы переопределяете оба метода. –

+1

Сделайте свои поля окончательными (или, по крайней мере, логически окончательными). Если они изменяемы, вы можете получить дубликаты в 'Set', потому что они были« уникальными »во время вставки, но не впоследствии. –

ответ

3

Просто используйте набор и переопределить для вашего класса City оба метода:

Помните, что это всегда хорошая практика, чтобы переопределить равных и hashcode, и это невозможно переопределить только один из них, не имея странного поведения в структурах данных, таких как HashSet и HashMap.

Примечания: Set является правильной структурой данных, потому что, как для определения:

Коллекция, не содержит дублирующие элементов. Более формально наборы не содержат пары элементов e1 и e2, таких, что e1.equals (e2), и в наиболее один нулевой элемент. Как видно из его названия, этот интерфейс моделирует математическую абстрактную абстракцию.

+0

Книга Джошуа Блоха * Эффективная Java * подробно обсуждает эти темы в пунктах 8 и 9 –

1

Вы должны просто переопределить equals и hashCode, сравнивая фактические значения для String и double значений в equals и основывают свой хэш на тех, в вашем методе hashCode.

В реализации, которую вы показываете, хэш может быть слабым - вы, вероятно, захотите использовать основное семя.

При использовании в соответствии с рекомендациями, equals и hashCode будут сравнивать ваши объекты и размещать их в ведрах на основе значений их членов, чего вы, как правило, хотите.

Если вы используете IDE (что рекомендуется), вы можете позволить проекту IDE использовать эти методы для вас.

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