Java: извлечение объекта из набора просто путем вычисления его хеш-кода - PullRequest
1 голос
/ 01 июля 2011

Я создал класс Event.Как видите, методы hashCode и equals используют только поле id типа long.

public class Event {
private long id;
private Map<String, Integer> terms2frequency;
private float vectorLength;

@Override
public long hashCode() {
    return this.id;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Event other = (Event) obj;
    if (id != other.id)
        return false;
    return true;
}

Я буду хранить объекты этого класса в коллекции HashSet.

Set<Event> events = new HashSet<Event>();

Поскольку для вычисления хеш-функции только поле типа long я бы хотел получитьэлементы из hashset событий, вычисляя хэш id.Например:

events.get(3);

Возможно ли или я должен использовать для этого hashMap:

Map<Long, Event> id2event = new HashMap<Long, Event>();

?

Ответы [ 2 ]

4 голосов
/ 01 июля 2011

Вы должны абсолютно не полагаться на уникальность хеш-кода.A long имеет 2 64 возможных значений;int имеет только 2 32 .Поэтому хеш-коллизии вполне возможны. Не используйте хеш-коды в качестве единственного теста на равенство.Это не то, для чего они предназначены.

Хеш-коды предназначены для быстрого перехода от ключа к набору потенциальных совпадений, которые затем проверяются более строго при нормальном равенстве.

(Кроме того, я не думаю, что для начала стоит использовать floatToIntBits для вычисления хеш-кода.)

. *1019* *1020*РЕДАКТИРОВАТЬ: Конечно, даже если вы действительно хотели бы полагаться на это, HashSet<E> не предоставляет метод для получения элемента по его хэш-коду, потому что это действительно плохая идея почти во всех случаях... если вы хотите сопоставить, создайте Map ...

0 голосов
/ 01 июля 2011

Вы можете сгенерировать статический класс (например, Utility) и создать метод, который может генерировать в нем уникальный хэш. Но вы должны оценить, сколько объектов будет создано, возможно, и затем создать алгоритм для генерации. уникальный для различения объектов. А также метод хеш-кода класса Event должен быть переопределен, потому что вы переопределили метод equals.

И используйте карту:

Карта id2event = new HashMap ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...