Java проблема компаратора при передаче в Collections.sort - PullRequest
1 голос
/ 19 марта 2020

При тестировании с меньшей нагрузкой в ​​локальной системе все работало нормально.

private static class CoordinateComparator implements Comparator<Coordinate> {

    @Override
    public int compare(Coordinate o1, Coordinate o2) {
        return o1.x <= o2.x ? -1 : 1;
    }

}

Здесь x является примитивным и выдает ошибку времени выполнения при запуске тестов. Под большой нагрузкой он ломался.

Затем я изменил компаратор на: -

private static class CoordinateComparator implements Comparator<Coordinate> {

    @Override
    public int compare(Coordinate o1, Coordinate o2) {
        return o1.x.compareTo(o2.x);
    }

}

В этом случае x - это целое число. Потом все заработало нормально. Любые идеи или мысли, почему это происходит. Я передавал этот компаратор в Collections.sort (массив, комп)

1 Ответ

6 голосов
/ 19 марта 2020

public static <T> void sort(List<T> list, Comparator<? super T> c) выдаст IllegalArgumentException, если будет установлено, что компаратор нарушает контракт Comparator.

В вашем коде первый метод compare несовместим для случая, когда o1.x равно o2.x. Он возвратит либо -1, либо 1 в зависимости от порядка сравнения экземпляров. В этом случае он должен вернуть 0.

Вы можете исправить это следующим образом:

public int compare(Coordinate o1, Coordinate o2) {
    return o1.x < o2.x ? -1 : o1.x > o2.x ? 1 : 0;
}

Хотя ваша альтернатива o1.x.compareTo(o2.x) кажется мне чище.

...