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 …