Con un TreeMap
es trivial proporcionar un Comparator
personalizado, anulando así la semántica provista por los objetos Comparable
añadidos al mapa. HashMap
s sin embargo no se puede controlar de esta manera; las funciones que proporcionan valores de hash y verificaciones de igualdad no se pueden 'cargar por los lados'.¿Por qué no permitir que una interfaz externa proporcione hashCode/equals para un HashMap?
Sospecho que sería fácil y útil diseñar una interfaz y adaptarla a HashMap
(o una nueva clase)? Algo como esto, excepto con mejores nombres:
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) { ... }
}
El problema case insensitive Map
consigue un solución trivial:
new HasharatorMap(String.CASE_INSENSITIVE_EQUALITY);
Sería esto factible, o hay algún problemas fundamentales de este enfoque?
¿El enfoque utilizado en cualquier biblioteca existente (que no sea JRE)? (. Probado Google, sin suerte)
EDIT: Niza solución presentada por hazzen, pero me temo que esta es la solución que estoy tratando de evitar ...;)
EDIT: Se cambió el título a ningún mencionar más tiempo "Comparador"; Sospecho que esto fue un poco confuso.
EDIT: respuesta aceptada en relación con el rendimiento; me encantaría una respuesta más específica!
EDITAR: Hay una implementación; ver la respuesta aceptada a continuación.
EDITAR: reformulé la primera oración para indicar más claramente que es la carga lateral que estoy buscando (y no ordenar, el orden no pertenece a HashMap).
"Esta clase no garantiza el orden del mapa, en particular, no garantiza que el pedido se mantenga constante en el tiempo". - Javadocs de HashMap. En otras palabras, HashMap no está ordenado. – Powerlord
Esta afirmación permite utilizar CUALQUIER implementación de hashCode y también permite que el Mapa cambie de tamaño a medida que avanza. ¿Entonces esta es una característica y no es un problema en este contexto? – volley