Comment gérer les valeurs nulles lors de l'utilisation du tri de collection Java


Lors de l'utilisation de la collection.trier en Java que dois-je retourner lorsque l'un des objets internes est null

Exemple:

Collections.sort(list, new Comparator<MyBean>() {
    public int compare(MyBean o1, MyBean o2) {
      return o2.getDate().compareTo(o1.getDate());
     } 

});

Disons que o2 n'est pas nul mais o2.getDate() c'est le cas, alors dois-je retourner 1 ou -1 ou 0 lors de l'ajout d'une validation null?

Author: Giancarlo Corzo, 2010-09-09

4 answers

Naturellement, c'est votre choix. Quelle que soit la logique que vous écrivez, elle définira les règles de tri. Donc, "devrait" n'est pas vraiment le bon mot ici.

Si vous voulez que null apparaisse avant tout autre élément, quelque chose comme ça pourrait faire

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());
} 
 31
Author: Nikita Rybak, 2010-09-08 21:00:17

En Java 8, vous pouvez également utiliser nullsFirst():

Comparator.nullsFirst(Date::compareTo).compare(dateOne, dateTwo);

Ou nullsLast():

Comparator.nullsLast(Date::compareTo).compare(dateOne, dateTwo);

Ces méthodes trieront null au début ou à la fin. Il n'y a pas de mal ou de bien si vous considérez null plus grand ou plus petit qu'un autre objet. Cela dépend totalement de vous, comme d'autres l'ont déjà dit.

 15
Author: user1438038, 2016-07-22 16:03:29

Cela dépend, considérez-vous null comme une grande valeur ou une faible valeur.

Vous pouvez considérer la plupart du temps que null

Et 0 serait une valeur de retour terrible ici.

 2
Author: Colin Hebert, 2010-09-08 20:59:00

Suite à la réponse de Nikita Rybak, j'ai déjà un comparateur d'énumération, et j'ajoute seulement la logique nulle à partir d'ici.

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);
        }
}

Dans ce formulaire, je peux appeler la méthode de tri sur ma liste.

    if(isBolOrdAscendente()) Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .ascending());
    else Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .descending());
 1
Author: ELD, 2013-01-10 23:40:19