2015-04-30 8 views
13

Parent è una classe ereditata da Child. che è ereditato da GrandChild. Ogni classe contiene l'elenco della classe figlio (cioè Parent contiene l'elenco di Child e Child contiene l'elenco di GrandChild). Ogni classe contiene 50 attributi (attrib1-atrib50). getChildList() restituisce l'ArrayList di oggetti di tipo Bambino getGrandChildList() restituisce l'ArrayList di oggetti di tipo nipotinoOrdinamento tramite Interfaccia comparatore e flussi java 8

Let resultSet essere Elenco dei Parent

List<Parent> resultSet 

Ora voglio per ordinare l'elenco in base a una certa attributi. Per esempio se voglio ordinare resultSet sulla base di due attributi genitore (diciamo Abilità 1 e l'attributo 2, io uso questo codice.

Comparator<Parent> byFirst = (e1, e2) -> e2.getAttrib1().compareTo(e1.getAttrib1()); 
    Comparator<Parent> bySecond = (e1, e2) -> e1.getAttrib2().compareTo(e2.getAttrib2()); 

Comparator<Parent> byThird = byFirst.thenComparing(bySecond); 


List<Parent> sortedList = resultSet.stream().sorted(byThird) 
       .collect(Collectors.toList()); 

Ora voglio ordinare la parentlist sulla base di attributi 1 di classe bambino e l'attributo 1 della classe GrandChild.Per ordinare questo:

+1

Come si ordina un elenco di 'Parent' per attributo di' Child' se ci sono molti 'Child' in ogni 'Parent'? Quale figlio della lista useresti per ottenere l'attributo da confrontare? – Misha

+0

di getChildList() ottengo l'accesso a Child e selezionerò un attributo child. –

+1

Quindi se un genitore ha 10 figli tutti hanno un valore diverso per attr1, quale useresti? – Misha

risposta

19

Utilizzare i parametri Comparator.comparing per confrontare i comparatori: sarà simile a questo, tranne che si scriverà la logica che si desidera utilizzare per estrarre valori da confrontare:

Comparator<Parent> byAttr1ofFirstChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getAttr1() 
); 

Comparator<Parent> byAttr1ofFirstGrandChild = Comparator.comparing(
    parent -> parent.getChildren().get(0).getGrandChildren().get(0).getAttr1() 
); 


List<Parent> sortedList = parents.stream() 
    .sorted(byAttr1ofFirstChild.thenComparing(byAttr1ofFirstGrandChild)) 
    .collect(toList()); 

Comparator.comparing sarebbe anche fare gli esempi in tua domanda molto più bello (utilizzando le importazioni statiche):

Comparator<Parent> byFirst = comparing(Parent::getAttrib1, reverseOrder()); 
Comparator<Parent> bySecond = comparing(Parent::getAttrib2); 
+0

reverseOrder(): - Non riesco a identificare questo metodo nel mio IDE –

+2

È 'Comparator.reverseOrder()', ma rende il codice più conciso per utilizzare le importazioni statiche – Misha

+1

oppure puoi eseguire il confronto '(Parent :: getAttrib1) .reversed(); '. –

Problemi correlati