por - ordenar una lista de numeros en java
Ordenar una ArrayList por tipo booleano primitivo (7)
Quiero ordenar mi ArrayList
usando un tipo booleano. Básicamente quiero mostrar entradas con true
primero. Aquí está mi código a continuación:
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;
}
});
Ordenar antes de ordenar: verdadero verdadero verdadero falso falso falso falso falso falso
Ordenar después de ordenar: falso falso verdadero verdadero verdadero verdadero falso falso falso falso
¿Por qué no usar algo como esto, es más fácil y java 8
listOfABCElements = {true, false, false, true, true};
listOfABCElements.stream().sorted(Comparator.comparing(Abc::isClickable,Comparator.reverseOrder()).collect(Collectors.toList());
salida: verdadero, verdadero, verdadero, falso, falso
reverseOrder es para orden primero verdadero y después falso, en otros casos, falsos va primero
listOfABCElements.stream().sorted(Comparator.comparing(Abc::isClickable).collect(Collectors.toList());
salida: falso, falso, verdadero, verdadero, verdadero
En este caso, una de las soluciones más fáciles es convertir booleanos en enteros, donde false
es 0
y true
es 1
. Luego regresa la diferencia del segundo y el primero.
Asi que:
int b1 = abc1.isClickable ? 1 : 0;
int b2 = abc2.isClickable ? 1 : 0;
return b2 - b1
Deberías hacerlo.
Java 8:
Collections.sort(abc, (abc1, abc2) ->
Boolean.compare(abc2.isClickable(), abc1.isClickable()));
Otra forma de ir es:
Collections.sort(abc, new Comparator<Abc>() {
@Override
public int compare(Abc abc1, Abc abc2) {
return Boolean.compare(abc2.isClickable,abc1.isClickable);
}
});
Quiero que los artículos con valor true
aparezcan primero. Mi solución sería:
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;
}
});
También es posible de esa manera.
myList.sort((a, b) -> Boolean.compare(a.isSn_Principal(), b.isSn_Principal()));
Una sugerencia simple sería usar el objeto Boolean
lugar de booleano y usar Collections.sort
.
Sin embargo, debe saber que el false
estará antes del true
porque el verdadero se representa como 1
y el falso como 0
. Pero entonces, simplemente puede cambiar su algoritmo y acceder en orden inverso.
Edición : como lo indicó soulscheck, puede usar Collections.reverseOrder
para revertir el orden impuesto por el Comparador.