2015-05-21 17 views
12

voglio ordinare seq1 ascendente e discendente seq2 quindi fare questo:Java flusso di ordinamento 2 variabili ascendente/desending

list = list.stream().sorted(comparing(AClass::getSeq1).thenComparing(  
    AClass::getSeq2).reversed()).collect(toList()); 

Ma il risultato venuto fuori come sia seq1 e seq2 vengono ordinati in ordine decrescente.

posso fare questo per fare seq1 ascendente e discendente seq2:

sorted(comparing(AClass::getSeq1) 
    .reversed().thenComparing(AClass::getSeq2).reversed() 

Che cosa è veramente il modo corretto di fare questo?

+0

In futuro, si prega di fornire il proprio 'dichiarazioni static' importazione. – aaiezza

risposta

21

Nel primo esempio, reversed viene applicato all'intero comparatore che confronta seq1 poi seq2 in ordine ascendente.

Quello che vi serve è quello di invertire il secondo confronto unico, che può essere fatto, per esempio, con:

import static java.util.Collections.reverseOrder; 
import static java.util.Comparator.comparing; 

list = list.stream().sorted(
         comparing(AClass::getSeq1) 
         .thenComparing(reverseOrder(comparing(AClass::getSeq2)))) 
         .collect(toList()); 


//or you could also write: 

list = list.stream().sorted(
         comparing(AClass::getSeq1) 
         .thenComparing(comparing(AClass::getSeq2).reversed())) 
         .collect(toList()); 
+0

Wow! ci sono più di un modo per risolvere il problema. Grazie! – Bruce

+11

['.thenComparing (AClass :: getSeq2, reverseOrder())'] (http://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#thenComparing-java.util. function.Function-java.util.Comparator-) è anche possibile e sarà il vincitore per quanto riguarda la lunghezza del codice sorgente (che corrispondenza ravvicinata) ... – Holger

+2

Grazie per aver aggiunto le istruzioni 'import static'. Avrebbero dovuto essere nella domanda ... – aaiezza