2011-12-29 32 views
8

Birden çok alana dayalı bir listeyi sıralıyorum.Groovy koleksiyonunu nasıl değiştirebilirim?

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

Bu iyi çalışır, ancak tarih tersine çevrilecek ve reverse() çalışmıyor istiyorum.

Yazarı artan düzende nasıl sıralıyorum ama tarihi azalan (ters) sıraya göre sıralıyorum? İstediğim şeyin

Örnek: Ben ne

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

Örnek: sort() kullanırsanız en fazla kontrolü elde edersiniz bu gibi çoklu özellik türlü için

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

cevap

20

Bir kapatma ya da bir Karşılaştırma ile, örneğin:

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 
} 
Veya daha fazla c sürümüne oncise ( Ted Naleid izniyle):

[ 
    {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

Müthiş:

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 } 

Aşağıdaki listede groovysh yukarıdaki koştu:

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

Ve doğru sıralanmış alınan çok teşekkürler! – ubiquibacon

+7

ayrıca bunu bir tek astarlıya kadar kısaltabilir (ve eğer açıksa bir açık seçeği atlayabilirsiniz): sıralanmışList.sort {a, b -> a.author <=> b.author ?: b.date <=> a.date} –

+2

@TedNaleid - Bahşiş için teşekkürler; Kısaltmayı düşünmüştüm, ama anlaşılabilirlik uğruna onu terk etmeye karar verdim. Senin için, bütünlük için buraya koyacağım. –

İlgili konular