Сортировка ArrayList примитивным булевым типом

Я хочу отсортировать мой ArrayList с помощью булевого типа. В основном я хочу сначала показывать записи с true. Вот мой код ниже:

Abc.java

public class Abc {
 int id;
 bool isClickable;

 Abc(int i, boolean isCl){
    this.id = i;
    this.isClickable = iCl;
 }
 }

Main.java

List<Abc> abc = new ArrayList<Abc>();

//add entries here

//now sort them
Collections.sort(abc, new Comparator<Abc>(){
        @Override
        public int compare(Abc abc1, Abc abc2){

            boolean b1 = abc1.isClickable;
            boolean b2 = abc2.isClickable;

            if (b1 == !b2){
                return 1;
            }
            if (!b1 == b2){
                return -1;
            }
            return 0;
        }
    });

Порядок перед сортировкой:    правда    правда    правда    ложный    ложный    ложный    ложный    правда    ложный    false

Заказ после сортировки: ложный  ложный  правда  правда  правда  правда  ложный  ложный  ложный  ложь

Ответ 1

Другой способ:

Collections.sort(abc, new Comparator<Abc>() {
        @Override
        public int compare(Abc abc1, Abc abc2) {
            return Boolean.compare(abc2.isClickable,abc1.isClickable);
        }
    });

Ответ 2

В этом случае одним из самых простых решений является преобразование булевых чисел в целые числа, где false - 0 и true - 1. Затем верните разницу второго и первого.

Итак:

        int b1 = abc1.isClickable ? 1 : 0;
        int b2 = abc2.isClickable ? 1 : 0;

        return b2 - b1

должен это сделать.

Ответ 3

почему не использовать что-то вроде этого, это проще и Java 8

listOfABCElements = {true, false, false, true, true};
listOfABCElements.stream().sorted(Comparator.comparing(Abc::isClickable,Comparator.reverseOrder()).collect(Collectors.toList());

вывод: true, true, true, false, false

reverseOrder для ордера сначала истина, а после ложь, в противном случае ложь идет первым

listOfABCElements.stream().sorted(Comparator.comparing(Abc::isClickable).collect(Collectors.toList());

вывод: ложь, ложь, правда, правда, правда

Ответ 4

Я хочу, чтобы объекты со значением true отображались первыми. Мое решение было бы:

Collections.sort(m_mall, new Comparator<Mall>(){

        @Override
        public int compare(Mall mall1, Mall mall2){

            boolean b1 = mall1.isClickable;
            boolean b2 = mall2.isClickable;

            return (b1 != b2) ? (b1) ? -1 : 1 : 0;
        }
    });

Ответ 5

Простым предложением было бы использовать объект Boolean вместо boolean и использовать Collections.sort.

Однако вы должны знать, что false будет перед true, потому что true представлены как 1 и false как 0. Но тогда вы можете просто изменить свой алгоритм и получить доступ в обратном порядке.

Изменить. Как указано в отчете soulscheck, вы можете использовать Collections.reverseOrder, чтобы вернуть порядок, наложенный компаратором.

Ответ 6

Java 8:

 Collections.sort(abc, (abc1, abc2) ->
                  Boolean.compare(abc2.isClickable(), abc1.isClickable()));

Ответ 7

Это также возможно.

myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal()));

Ответ 8

Используя Kotlin, вы можете сделать что-то вроде этого:

listOfABCElements.sortBy { it.isClickable }

вывод: true, true, true, false, false

в обратном порядке:

listOfABCElements.sortByDescending { it.isClickable }

вывод: ложь, ложь, правда, правда, правда