2010-09-08 12 views
17

Quando si utilizza Collection.sort in Java che cosa devo tornare quando uno degli oggetti interni è nullCome gestire i null quando si utilizza la raccolta Java sorta

Esempio:

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

}); 

Diciamo o2 non è nullo ma o2.getDate() lo è, quindi dovrei restituire 1 o -1 o 0 quando aggiungo una convalida nulla?

risposta

25

Naturalmente, è la vostra scelta. Qualunque sia la logica che scrivi, definirà le regole di ordinamento. Quindi "dovrei" non è la parola giusta qui.

Se si vuole nulla a comparire prima di qualsiasi altro elemento, qualcosa di simile potrebbe fare

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()); 
} 
+1

Cosa succede se si desidera ordinare in modo crescente i propri valori nulli di fronte ma discendenti sono alla fine. In sostanza capovolgere completamente la lista? – Jeremy

+0

Ho usato questo codice e ho provato Collections.reverseOrder() e non ha funzionato con Collections.reverse (List); – Jeremy

+0

@Jeremy sì, ho ragione, sto affrontando lo stesso problema tutti i dati del valore nullo vengono prima e i dati valutati arrivano alla fine. –

2

Dipende, non si considera nullo come un grande valore o un valore basso.

È possibile considerare la maggior parte delle volte che null < altro, ma dipende dal contesto.

E 0 sarebbe un valore di ritorno terribile qui.

1

In seguito alla risposta di Nikita Rybak, ho già un comparatore di enum e aggiungo solo la logica nulla da qui.

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

In questo modulo posso chiamare il metodo di ordinamento sulla mia lista.

if(isBolOrdAscendente()) Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .ascending()); 
    else Collections.sort(listado, CmunParametrosDTO.Orden.ByStrDescripcion .descending()); 
+0

Grazie mille ELD ..dopo aver cercato molto ... la soluzione ha funzionato per me: D :) –

12

In Java 8 è possibile utilizzare anche nullsFirst():

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

O nullsLast():

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

questi metodi sia sorta null all'inizio o alla fine. Non c'è torto o ragione se consideri null più grande o più piccolo di un altro oggetto. Questo dipende totalmente da te, come già affermato da altri.

+0

Bello, sembra che Java si sia evoluto un po 'a questo riguardo –

Problemi correlati