Ответ 1
Другой способ:
Collections.sort(abc, new Comparator<Abc>() {
@Override
public int compare(Abc abc1, Abc abc2) {
return Boolean.compare(abc2.isClickable,abc1.isClickable);
}
});
Я хочу отсортировать мой 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
Заказ после сортировки: ложный ложный правда правда правда правда ложный ложный ложный ложь
Другой способ:
Collections.sort(abc, new Comparator<Abc>() {
@Override
public int compare(Abc abc1, Abc abc2) {
return Boolean.compare(abc2.isClickable,abc1.isClickable);
}
});
В этом случае одним из самых простых решений является преобразование булевых чисел в целые числа, где false
- 0
и true
- 1
. Затем верните разницу второго и первого.
Итак:
int b1 = abc1.isClickable ? 1 : 0;
int b2 = abc2.isClickable ? 1 : 0;
return b2 - b1
должен это сделать.
почему не использовать что-то вроде этого, это проще и 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());
вывод: ложь, ложь, правда, правда, правда
Я хочу, чтобы объекты со значением 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;
}
});
Простым предложением было бы использовать объект Boolean
вместо boolean и использовать Collections.sort
.
Однако вы должны знать, что false
будет перед true
, потому что true представлены как 1
и false как 0
. Но тогда вы можете просто изменить свой алгоритм и получить доступ в обратном порядке.
Изменить. Как указано в отчете soulscheck, вы можете использовать Collections.reverseOrder
, чтобы вернуть порядок, наложенный компаратором.
Java 8:
Collections.sort(abc, (abc1, abc2) ->
Boolean.compare(abc2.isClickable(), abc1.isClickable()));
Это также возможно.
myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal()));
Используя Kotlin, вы можете сделать что-то вроде этого:
listOfABCElements.sortBy { it.isClickable }
вывод: true, true, true, false, false
в обратном порядке:
listOfABCElements.sortByDescending { it.isClickable }
вывод: ложь, ложь, правда, правда, правда