objetos - java hashset methods
Java HashSet con un criterio de igualdad personalizado? (3)
Hay un par de marcos de colecciones de terceros que permiten una lógica de igualdad personalizada. Esto es perfecto para anular la igualdad para los objetos que no puedes alterar la fuente.
Los mapas / conjuntos de Trove admiten el uso de estrategias de hash personalizadas, lo que le permite ajustar las colecciones según las características de los datos de entrada. Esta característica también le permite definir funciones hash cuando no es posible anular Object.hashCode ().
Para lograr esto, cualquier tipo que necesite una corrección estándar, debe implementar la interfaz HE-Collection EqualsAndHashCorrection. Esta interfaz define los métodos hashCodeInHeCollection () y equalsInHeCollection (Object), que sirven como corrección para los métodos implementados incorrectamente hashCode () y equals (Object).
Esta pregunta ya tiene una respuesta aquí:
Estaba buscando algo similar a la capacidad del Java TreeSet para recibir un comparador personalizado en el momento de la creación de instancias, por lo que necesitaba no utilizar los criterios de igualdad (y código hash) predeterminados del objeto.
Lo más cercano que pude encontrar fue envolver mis objetos en una clase privada personalizada, pero eso me parece extraño :( Esto termina siendo un tipo de tema recurrente en la programación, así que me preguntaba si hay algo disponible para que lo usemos. Tal vez en las bibliotecas comunes?
Gracias
No, has encontrado exactamente la solución que debes usar.
Incluso para TreeSet
, está mal visto usar criterios de comparación que no son compatibles con equals
:
Tenga en cuenta que el ordenamiento mantenido por un conjunto ordenado (ya sea que se proporcione o no un comparador explícito) debe ser coherente con iguales si el conjunto ordenado debe implementar correctamente la interfaz de conjunto.
(No sé sobre Apache Commons, pero Guava rejected specifically solicitudes de este tipo de cosas).
Usted tiene razón, cuando desea usar cualquiera de los Trees
( TreeMap
, TreeSet
), los objetos que agregue deben implementar Comparable
.
Para los tipos primitivos, Java ha resuelto esto por ti.
Para objetos personalizados tienes 3 posibilidades:
Uno de sus objetos ya tiene un ID único de un tipo primitivo o un Tipo que ya implementa
compareTo()
(comoString
). Luego use este campo para compareTo, si los valores de los otros no son importantes para la igualdad. (Pero entoncesequals()
también debe usar este único campo)Utilice
EqualsBuilder
de Apache: esto funciona con reflexión y no es la solución más rápidaEscríbelo usted mismo, lea un tutorial sobre cómo hacerlo: por ejemplo:
Josh Bloch: Effective java 2nd Edition
Pero no olvide que equals()
, y compareTo()
deben ser compatibles (y hashCode()
), de modo que no infrinja el contrato equals. (El contrato en sí es menos comprensible, pero queda claro si usted sigue uno de los tutoriales iguales).
O olvídelo todo, y use un HashSet
, HashMap
.