El método de comparación viola su contrato general en Java 7

Obtengo un “Método de comparación que infringe su contrato general” después de comstackr algunos códigos Java en Java 7 y luego ejecutarlos.

He leído El método de comparación viola su contrato general. Solo Java 7 y darse cuenta de que hay algo mal con mi código que fue ignorado en versiones anteriores de Java. Sin embargo, no puedo descifrar qué está mal con mi código. Collections.sort () genera el error.

Mi código es:

public Comparator sortBySmoothDays() { Comparator c = new Comparator() { public int compare(Object arg0, Object arg1) { Date date0 = ((PosObject)arg0).getDate(); Date date1 = ((PosObject)arg1).getDate(); double d1 = MyUtils.calcSmoothDays(date0, new Date()); double d2 = MyUtils.calcSmoothDays(date1, new Date()); if (d1 >= d2) { return 1; } else { return -1; } } }; return c; } Comparator c = ComparatorUtils.getInstance().sortBySmoothDays(); Collections.sort(posList, c); 

¿Alguien puede ayudar? ¡Gracias!

Un comparador debe devolver 0 si los valores son iguales. En su implementación actual, devuelve 1 si son iguales. La forma más fácil de comparar sus valores double correctamente es llamar a Double.compare :

 double d1 = MyUtils.calcSmoothDays(date0, new Date()); double d2 = MyUtils.calcSmoothDays(date1, new Date()); return Double.compare(d1, d2); 

Con su comparador, cada objeto se compara más que sí mismo: compare(x,x) siempre devuelve uno.

Esto viola el siguiente requisito :

El implementador debe asegurarse de que sgn (compare (x, y)) == -sgn (compare (y, x)) para todos los valores x e y.

El requisito anterior implica que compare(x,x) debe devolver cero.

Le recomendaría leer el contrato y asegurarse de que su implementación lo cumpla.

En particular, si date0.equals(date1) , el comparador probablemente debería devolver cero inmediatamente, sin realizar conversiones y comparaciones de coma flotante.

¿No es el problema de que si dos objetos se comparan igual, es decir, calcSmoothDays devuelve el mismo valor, entonces podrías tener una situación donde comparar (object1, object2) == 1, y comparar (object2, object1) == 1 también?

Entonces implica que object1> object 2 y object2> object 1 …