Как отсортировать ArrayLists с помощью booleans в java?

У меня есть ArrayList с пользовательскими объектами. Они содержат объект флажка, который я хочу сортировать. Я использую эту функцию компаратора для сортировки:

Я использую оператор XOR, чтобы проверить, равны ли они друг другу, а затем отменить его.

Однако это не работает, и список остается в том же порядке.

Кто-нибудь знает, что случилось?

public class CustomSelectSort implements Comparator<ObjPerson> { @Override public int compare(ObjPerson o1, ObjPerson o2) { return !(o1.select.isChecked() ^ o2.select.isChecked()) ? 1 : -1; } } 

Solutions Collecting From Web of "Как отсортировать ArrayLists с помощью booleans в java?"

Вы возвращаете только -1 (меньше) или +1 (больше), а не 0 (равно).

См. Определение java.util.Comparator :

Сравнивает два аргумента для заказа. Возвращает отрицательное целое число, ноль или положительное целое число, поскольку первый аргумент меньше, равен или больше второго.

В предшествующем описании обозначение sgn (выражение) обозначает математическую функцию signum, которая определена для возврата одного из -1, 0 или 1 в зависимости от того, является ли значение выражения отрицательным, нулевым или положительным.

Разработчик должен убедиться, что sgn (compare (x, y)) == -sgn (ср. (Y, x)) для всех x и y. (Это означает, что compare (x, y) должен генерировать исключение тогда и только тогда, когда compare (y, x) генерирует исключение).

Разработчик должен также гарантировать, что отношение транзитивно: ((compare (x, y)> 0) && (compare (y, z)> 0)) подразумевает сравнение (x, z)> 0.

Наконец, разработчик должен убедиться, что compare (x, y) == 0 означает, что sgn (compare (x, z)) == sgn (compare (y, z)) для всех z.

Это обычно так, но строго не требуется, чтобы (ср. (X, y) == 0) == (x.equals (y)). Вообще говоря, любой компаратор, нарушающий это условие, должен четко указывать этот факт. Рекомендуемым языком является «Примечание: этот компаратор налагает порядок, который несовместим с равными».

Предложение перед Java 1.7:

 public int compare(ObjPerson o1, ObjPerson o2) { boolean b1 = o1.select.isChecked(); boolean b2 = o2.select.isChecked(); if( b1 && ! b2 ) { return +1; } if( ! b1 && b2 ) { return -1; } return 0; } 

Предложение с Java 1.7 :

 public int compare(ObjPerson o1, ObjPerson o2) { boolean b1 = o1.select.isChecked(); boolean b2 = o2.select.isChecked(); return Boolean.compare( b1, b2 ); }