Cuando se prueba con menos carga en locales que funcionaba bien.
private static class CoordinateComparator implements Comparator<Coordinate> {
@Override
public int compare(Coordinate o1, Coordinate o2) {
return o1.x <= o2.x ? -1 : 1;
}
}
Aquí x es primitivo y que estaba dando error de ejecución cuando se llevaron a cabo las pruebas. Bajo carga pesada que se rompía.
Luego cambié comparador para: -
private static class CoordinateComparator implements Comparator<Coordinate> {
@Override
public int compare(Coordinate o1, Coordinate o2) {
return o1.x.compareTo(o2.x);
}
}
En este caso x es un número entero. Entonces empezó a trabajar muy bien. Cualquier ideas o pensamientos por qué estaba ocurriendo. Yo estaba pasando este comparador a Collections.sort (array, comp)
public static <T> void sort(List<T> list, Comparator<? super T> c)
arrojaría IllegalArgumentException
si se encuentra el comparador de violar el Comparator
contrato.
En su código, el primer compare
método es inconsistente para el caso en que o1.x
sea igual o2.x
. Se volverá o bien -1 o 1 dependiendo del orden en el que se comparan las instancias. Debe devolver 0 en este caso.
Lo puede solucionar de la siguiente manera:
public int compare(Coordinate o1, Coordinate o2) {
return o1.x < o2.x ? -1 : o1.x > o2.x ? 1 : 0;
}
A pesar de su o1.x.compareTo(o2.x)
alternativa parece más limpio para mí.