una - mostrar elementos de un arraylist java
Cómo manejar nulos cuando se utiliza la ordenación de colecciones Java (4)
Depende, ¿considera usted nulo como un gran valor o un bajo valor?
Puede considerar la mayor parte del tiempo que nulo <todo lo demás, pero depende del contexto.
Y 0 sería un valor de retorno terrible aquí.
Al usar Collection.sort en Java, ¿qué debo devolver cuando uno de los objetos internos es nulo?
Ejemplo:
Collections.sort(list, new Comparator<MyBean>() {
public int compare(MyBean o1, MyBean o2) {
return o2.getDate().compareTo(o1.getDate());
}
});
Digamos que o2 no es nulo pero o2.getDate () lo es, ¿debería devolver 1 o -1 o 0 al agregar una validación nula?
En Java 8 también puedes usar nullsFirst()
:
Comparator.nullsFirst(Date::compareTo).compare(dateOne, dateTwo);
O nullsLast()
:
Comparator.nullsLast(Date::compareTo).compare(dateOne, dateTwo);
Estos métodos ordenarán null
al principio o al final. No hay nada incorrecto ni correcto si considera null
más grande o más pequeño que otros objetos. Esto depende totalmente de usted, como ya han dicho otros.
Naturalmente, es tu elección. Cualquiera que sea la lógica que escriba, definirá las reglas de clasificación. Así que ''debería'' no es realmente la palabra correcta aquí.
Si desea que aparezca nulo antes de cualquier otro elemento, algo como esto podría hacer
public int compare(MyBean o1, MyBean o2) {
if (o1.getDate() == null) {
return (o2.getDate() == null) ? 0 : -1;
}
if (o2.getDate() == null) {
return 1;
}
return o2.getDate().compareTo(o1.getDate());
}
Siguiendo la respuesta de Nikita Rybak, ya tengo un comparador de enumeración y solo agrego la lógica nula desde aquí.
public enum Orden implements Comparator<CmunParametrosDTO> {
ByStrDescripcion {
public int compare(CmunParametrosDTO item1, CmunParametrosDTO item2) {
if (item1.getStrDescripcion() == null && item2.getStrDescripcion() == null)
return 0;
if (item1.getStrDescripcion() == null)
return 1;
else if (item2.getStrDescripcion() == null)
return -1;
return item1.getStrDescripcion().compareTo(item2.getStrDescripcion());
}
}
public abstract int compare(CmunParametrosDTO item1, CmunParametrosDTO item2);
public Comparator<CmunParametrosDTO> ascending() {
return this;
}
public Comparator<CmunParametrosDTO> descending() {
return Collections.reverseOrder(this);
}
}
De esta forma puedo llamar al método de clasificación en mi lista.
if(isBolOrdAscendente()) Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .ascending());
else Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .descending());