Skip to content

Date archive for: novembre 2010

Google Guava : trier des éléments à champs nullables

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 ]