2011-12-29 7 views
8

複数のフィールドに基づいてリストをソートしています。Groovyコレクションのソートを元に戻す方法は?

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

これは正常に動作しますが、私は日付が逆転されるとreverse()動作しませんします。

著者は昇順でソートしますが、降順(逆順)でソートするにはどうすればよいですか?私が何をしたいの

例:私が持っているものの

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

例:あなたはsort()を使用する場合は、ほとんどのコントロールを取得します。このようなマルチプロパティの種類については

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

答えて

20

クロージャーまたはコンパレータを使用して、たとえば:

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 
} 

またはより多くのcバージョン(Ted Naleidの礼儀)oncise:、

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

恐ろしい:

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

、正しく並べ替えを受け取っ:

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 } 

私は、以下のリストにgroovysh上記を走りましたどうもありがとう! – ubiquibacon

+7

これを1つのライナーに短くすることもできます(チェックを明示的に省略することもできます)。sortedList.sort {a、b - > a.author <=> b.author?b.date <=> a.date} –

+2

@TedNaleid - チップをありがとう。私はそれを短縮することを考えていたが、分かりやすくするためにそれを残すことに決めた。私はあなたのことを完全にするためにそこに入れていきます。 –