Voici un problème auquel j’ai été confronté plus d’une fois : trier en java des éléments en fonction d’un de ses attributs … qui peut être null.
La méthode classique pour faire ça : le bon vieux comparateur, mais qui devient vite compliqué avec les test de nullité :
Comparator<MonBean> byLibelle = new Comparator<MonBean>() {
public int compare(final MonBean b1, final MonBean b2) {
if (b1.getLibelle() == null) {
// null des deux côté
if (b2.getLibelle() == null) {
return 0;
} else {
// b2 non null, donc supérieur
return -1;
}
} else {
if (b2.getLibelle() == null) {
// b2 null, b1 est donc supérieur
return 1;
}
}
return b1.getLibelle().compareTo(b2.getLibelle());
}
};
Collections.sort(myList, byLibelle);
Bon, c’est un peu bourrin, moche, mais ça fonctionne.
Voici une autre solution beaucoup plus élégante utilisant la classe Ordering de Guava :
Comparator<MonBean> byLibelle = new Comparator<MonBean>() {
public int compare(final MonBean b1, final MonBean b2) {
return Ordering.natural().
nullsFirst().
compare(b1.getLibelle(),
b2.getLibelle());
}
};
Collections.sort(myList, byLibelle);
Ici, Ordering.natural().nullsFirst()
retourne une instance de la classe Ordering effectuant un classement par ordre naturel avec les éléments nulls en premier. Simple non ?
Ce qu’il faut retenir, c’est qu’Ordering est un Comparator aux hormones permettant d’effectuer des tris multiples, d’appliquer une fonction sur les éléments avant le tri, etc …
[ Ordering, Javadoc ]