descargar - Método de comparación viola su contrato general en Java 7
java runtime environment (3)
Obtengo un "Método de comparación que viola su contrato general" después de compilar un código Java en Java 7 y luego ejecutarlo.
¡He leído que el método de comparación viola su contrato general! Solo Java 7 y se da cuenta de que hay algo mal con mi código que se ignoró en versiones anteriores de Java. Sin embargo, no puedo averiguar qué está mal con mi código. El 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!
¿No es el problema que si dos objetos se comparan igual, es decir, calcSmoothDays devuelve el mismo valor, entonces podría tener una situación donde comparar (objeto1, objeto2) == 1, y comparar (objeto2, objeto1) == 1 también?
Por lo tanto, implica que object1> object 2 y object2> object 1 ...
Con su comparador, cada objeto se compara más grande que sí mismo: compare(x,x)
siempre devuelve uno.
Esto viola el siguiente requirement :
El implementador debe asegurarse de que sgn (compare (x, y)) == -sgn (compare (y, x)) para todos x e y.
El requisito anterior implica que la compare(x,x)
debe devolver cero.
Recomendaría leer el requirement y asegurarse de que su implementación lo cumpla.
En particular, si date0.equals(date1)
, el comparador probablemente debería devolver cero de inmediato, sin realizar conversiones ni comparaciones de punto flotante.
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);