2012-08-01 15 views
5

¿Hay algún mecanismo Equalator como Comparator, así que puedo tener diferentes equivalentes para preparar listas?Un mecanismo para tener diferentes iguales (equivalentes físicos y equivalentes lógicos) en los objetos de la Colección

EDIT: Mi objetivo es diferenciar entre list1.equals actuales (list2), que comprueba si es una copia superficial o también una copia profunda con todos los objetos a.equals (b) y list1.identical (list2), que comprueba si es simplemente una copia superficial con el listado sin modificar

Todas estas listas son del mismo modelo. Algunas son copias de sí mismas, por lo que mantienen el puntero a los mismos objetos, y otras son copias profundas, por lo que la jerarquía se replica por completo, porque tienen actualizaciones en el contenido, no solo en la estructura.

Me encuentro a menudo makin list1.equals (list2) pero necesito un mecanismo para decir si ambos son TOTAL copias (mismos objetos en el mismo orden para las colecciones) o a veces si son copias LÓGICAS (a través de mi propia lógica implementada es igual), por lo que la lista llamaría a iguales y los objetos deberían implementar algo más que a == b.

Mi problema es que no hay interfaz Equalator, y si puedo reemplazar los objetos es igual a pierdo la capacidad de comparar por total igual (a == b)

Por ejemplo, esto sería bueno;

Collections.equal(l1,l2,new Equalator(){ 
    @Override public boolean equals(Obj1,Obj2){ 
      //Default lists comparison plus commparison of objects based on 
      return (obj1.propertyX() == obj2.propertyX()); 
    } 
}); 

y todavía pude hacer list1.equals (list2) por lo que usan iguales por defecto (obj1 == obj2) y esto sólo sería cierto si los objetos contenidos son exactamente lo mismo.

La primera operación es útil para verificar si la lista (que podría ser una lista actualizada con objetos totalmente recreados del modelo) sigue siendo igual a la lista anterior.

La segunda operación es útil para verificar si la lista (que era una copia superficial de la versión actual del modelo de datos), no contiene ningún cambio trascendente para moverla dentro del código cuando era la versión actualizada.

EDIT: Un muy buen ejemplo sería tener una lista de puntos (x, y). Deberíamos poder saber si ambas listas son iguales porque son exactamente el mismo conjunto de puntos o igual porque los puntos que contienen son iguales de una manera lógica. Si pudiéramos implementar tanto phyEqual como logEqual para objetar, y tener ambos métodos en cualquier objeto así list.phyEqual (list2) o list1.logEqual (list2)

+0

Tienes un montón de contexto, pero ¿cuál es tu * pregunta * aquí? –

+0

Primera línea. Luego defino mi problema. Lo siento, comencé con "no está allí" en lugar de "está allí" y creo que es por eso que su lista – Whimusical

Respuesta

2

Su pregunta realmente no se ve claramente, al menos para mí . Si esto no responde correctamente, ¿podría volver a redactar un poco?

Dentro de un determinado tipo concreto de Colección, la mayoría de las implementaciones ya hacen lo que usted sugiere. Por ejemplo:

public boolean equals(Object o) { 
     if (o == this) 
      return true; 

En este caso, algo como esto podría tener sentido.
Puede reemplazar fácilmente esto: [debe añadirse prueba para los nulos]

@Override 
    public boolean equals(Object o) { 
     if (o.getPrimaryKey() == this.getPrimaryKey()) 
      return true; 
     return super().equals(o); 

Si va a crear colecciones estándar, incluso se puede reemplazar el método anónima iguales durante la construcción.

Si esto no hace lo que quiere, puede extender Colecciones usted mismo y anular cualquiera de los métodos para hacer algo similar.

¿Eso ayuda?

+0

confusa al menos, tiene un igual que parece que ambas listas tienen el mismo tamaño, los mismos elementos y el mismo orden. El problema es que usa igual para decir si ambos objetos son iguales, por lo que significa que sin una interfaz de ecuador, tengo que cambiar todo el marco para tener una cadena adicional de igualdades. Puedo implementar equals en mis objetos como lógico o físico igual, pero luego no puedo usar el otro tipo – Whimusical

+0

Hay muy pocos casos en el mundo real en los que hay más de una definición de iguales que en realidad sirve a cualquiera. –

+0

Lista. list.equals (list2) si ambos tienen el mismo tamaño, elementos y orden (teniendo en cuenta que los elementos son iguales si satisfacen a.equals (b)). Pero list.equals2 (list2) podría significar que ambos tienen el mismo tamaño, elementos y orden (teniendo en cuenta 2 obj son iguales si a == b). Por supuesto, asumiendo que no podemos asegurar que a.equals (b) no se invalide, entonces no va más allá de a == b – Whimusical

2

Una respuesta tardía, pero tal vez sea útil para alguien ...

El Equivalence clase de guayaba es el mismo para la equivalencia como comparador para comparar. Debería escribir su propio método para comparar las listas (no hay soporte en Guava para eso), pero luego podría llamar a este método con varias definiciones de equivalencia.

O puede rodar su propia interfaz:

interface Equalator<T> { 
    boolean equals(T o1, T o2); 
} 

Una vez más, tiene que escribir su método (trivial)

boolean <T> listEquals(List<T> list1, List<T> list2, Equalator<T> equalator) { 
    ... 
} 

... pero luego puede volver a utilizarla con diferentes implementaciones ListEqualator .

Cuestiones relacionadas