С TreeMap
тривиально, чтобы предоставить пользовательский Comparator
, тем самым переопределяя семантику, предоставляемую Comparable
объектами, добавленными на карту. HashMap
однако не может управляться таким образом; функции, предоставляющие хэш-значения и проверки равенства, не могут быть "загружены боковыми".
Я подозреваю, что было бы легко и полезно разработать интерфейс и модифицировать его в HashMap
(или новый класс)? Что-то вроде этого, кроме лучших имен:
interface Hasharator<T> {
int alternativeHashCode(T t);
boolean alternativeEquals(T t1, T t2);
}
class HasharatorMap<K, V> {
HasharatorMap(Hasharator<? super K> hasharator) { ... }
}
class HasharatorSet<T> {
HasharatorSet(Hasharator<? super T> hasharator) { ... }
}
Проблема без учета регистра Map
получает тривиальное решение:
new HasharatorMap(String.CASE_INSENSITIVE_EQUALITY);
Будет ли это выполнимо или вы можете увидеть фундаментальные проблемы с этим подходом?
Используется ли подход в любых существующих (не JRE) libs? (Пробовал Google, не повезло.)
EDIT: Хорошее обходное решение, представленное hazzen, но я боюсь, что это обходной путь, который я пытаюсь избежать...;)
EDIT: Изменено название, чтобы больше не упоминать "Компаратор"; Я подозреваю, что это было немного запутанно.
EDIT: принятый ответ относительно производительности; хотел бы получить более конкретный ответ!
EDIT: существует реализация; см. принятый ответ ниже.
EDIT: перефразировав первое предложение, чтобы более четко указать, что это боковая загрузка, которую я после (и не заказываю, порядок не принадлежит HashMap).