2011-12-29 15 views
8

Sortuję listę na podstawie wielu pól.Jak odwrócić coś w rodzaju kolekcji Groovy?

sortedList.sort {[it.getAuthor(), it.getDate()]} 

Działa to dobrze, ale chcę data zostać odwrócone i reverse() nie działa.

Jak posortować autora w porządku rosnącym, ale posortować datę w porządku malejącym (wstecznym)?

Przykład czego chcę:

Author Date 
Adam  12/29/2011 
Adam  12/20/2011 
Adam  10/10/2011 
Ben  11/14/2011 
Curt  10/17/2010 

Przykład tego, co mam:

Author Date 
Adam  10/10/2011 
Adam  12/20/2011 
Adam  12/29/2011 
Ben  11/14/2011 
Curt  10/17/2010 

Odpowiedz

20

Dla wielu rodzajów własności tak dostaniesz największą kontrolę, jeśli używasz sort() z zamknięciem lub komparatorem, np .:

sortedList.sort { a, b -> 
    if (a.author == b.author) { 
     // if the authors are the same, sort by date descending 
     return b.date <=> a.date 
    } 

    // otherwise sort by authors ascending 
    return a.author <=> b.author 
} 

Lub więcej c oncise wersji (dzięki uprzejmości Ted Naleid):

sortedList.sort { a, b -> 

    // a.author <=> b.author will result in a falsy zero value if equal, 
    // causing the date comparison in the else of the elvis expression 
    // to be returned 

    a.author <=> b.author ?: b.date <=> a.date 
} 

Pobiegłem powyższe groovysh na poniższej liście:

[ 
    [author: 'abc', date: new Date() + 1], 
    [author: 'abc', date: new Date()], 
    [author: 'bcd', date: new Date()], 
    [author: 'abc', date: new Date() - 10] 
] 

i otrzymał prawidłowo klasyfikowane:

[ 
    {author=abc, date=Fri Dec 30 14:38:38 CST 2011}, 
    {author=abc, date=Thu Dec 29 14:38:38 CST 2011}, 
    {author=abc, date=Mon Dec 19 14:38:38 CST 2011}, 
    {author=bcd, date=Thu Dec 29 14:38:38 CST 2011} 
] 
+0

Awesome, wielkie dzięki! – ubiquibacon

+7

można również skrócić to do jednej linijki (i pomiń wyraźne, jeśli zaznacz) za pomocą: sortedList.sort {a, b -> a.author <=> b.author?: B.date <=> a.date} –

+2

@ TedNaleid - Dzięki za wskazówkę; Zastanawiałem się nad jego skróceniem, ale postanowiłem ją opuścić ze względu na zrozumiałość. Włożę tam twoje, dla kompletności. –