2010-09-07 31 views
9

Hay un objeto de Java Bean que ha implementado la función equals según ciertos criterios (Criterio A). Tengo un requerimiento para identificar objetos únicos basados ​​en otro criterio (Criterio B). Como la función equals usa el criterio A, no puedo usar HashSet. Así que pensé en usar TreeSet con mi Comparator personalizado que se basa en el criterio B. Mi pregunta es, ¿se permite hacer así? Cualquier problema con este enfoque?TreeSet y es igual a la función

Gracias.

Respuesta

14

Aquí es un poco de guía de Oracle Java:

Tenga en cuenta que el orden mantenido por un conjunto (si no se proporciona una explícita comparador) debe ser consistente con los iguales si se va a correctamente implementar la interfaz Set. (Ver Comparable o Comparator para una definición precisa del consistentes con iguales.) Esto es así porque el interfaz conjunto se define en términos de la operación es igual, pero un TreeSet ejemplo, realiza todas las comparaciones clave utilizando su compareTo (o compare) método , por lo que dos claves que se consideran iguales por este método son, desde el punto de vista del conjunto, iguales. El comportamiento de un conjunto está bien definido, incluso si su orden es incompatible con equals; simplemente no obedece el contrato general de la interfaz Set.

Creo que en términos de técnica, no, no tiene ningún problema. Pero, en términos de codificación, legibilidad y mantenibilidad, debe tener cuidado, porque otras personas pueden hacer mal uso o no entender lo que está haciendo

1

Si realiza búsquedas con frecuencia y agrega elementos raramente, considere guardarlos en un List ordenado por Criterio B y usando Collections.binarySearch.

1

Puede envolverlos:

class BeanWrapper { 

... 

public boolean equals(Object other) { 
    return myBean.critB.equals(((Bean)other).critB); 
} 

} 

y ponerlos en el conjunto de esa manera.