Подтвердить что ты не робот

Java HashSet с пользовательскими критериями равенства?

Я искал нечто похожее на способность Java TreeSet получать пользовательский компаратор во время создания экземпляра, поэтому мне не нужно было использовать критерии равенства по умолчанию (и хеш-код).

Ближайшим, с которым я мог придумать, было обернуть мои объекты в частный пользовательский класс, но это кажется взломанным:( Это заканчивается тем, что повторяется при программировании, поэтому мне было интересно, если что-то уже доступно для нас использовать. Возможно, в библиотеках общин?

Спасибо

4b9b3361

Ответ 1

Нет, вы нашли именно то решение, которое вы должны использовать.

Даже для TreeSet, нахмурился, чтобы использовать критерии сравнения, которые не совместимы с equals:

Обратите внимание, что порядок, поддерживаемый сортированным набором (будь то явный компаратор), должен быть согласован с равным, если отсортированный набор должен правильно реализовать интерфейс Set.

(Я не знаю об Apache Commons, но Guava конкретно отклонил запросы на подобные вещи.)

Ответ 2

Вы правы, если хотите использовать любой из Trees (TreeMap, TreeSet) добавляемые объекты должны реализовать Comparable.

Для примитивных типов Java решила это для вас.
Для пользовательских объектов у вас есть 3 возможности:

  • Один из ваших объектов уже имеет уникальный идентификатор примитивного типа или Тип, который уже реализует compareTo() (например, String) Затем используйте это поле для compareTo, если значения других не важны для равенства. (Но тогда equals() должно также использовать только одно поле)

  • Используйте EqualsBuilder из Apache: Это работает с отражением и не является самым быстрым решением

  • Напишите его самостоятельно, прочитайте инструкцию, как это сделать: например:

Джош Блох: Эффективное java 2nd Edition

Но не забывайте, что equals() и compareTo() должны быть совместимы (и hashCode() тоже), чтобы вы не нарушали равный контракт. (Сам контракт менее понятен, но он становится понятным, если вы используете одно из этих учебных пособий.)

Или забудьте все, и используйте HashSet, HashMap.

Ответ 3

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

Карты/настройки Trove поддерживают использование пользовательских стратегий хэширования, позволяя вам настраивать коллекции на основе характеристик ввода данные. Эта функция также позволяет вам определять хеш-функции, когда она невозможно переопределить Object.hashCode().

Чтобы достичь этого, любой тип, который нуждается в стандартной коррекции, должен реализовать интерфейс HE-Collection EqualsAndHashCorrection. Эта интерфейс определяет методы hashCodeInHeCollection() и equalsInHeCollection (Object), которые служат коррекцией для неверные реализованные методы hashCode() и equals (Object).