2011-12-29 5 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 버전 oncise (Ted Naleid의 의례),

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

최고 :

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에서 위를 달렸다 :

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

그리고 정확하게 분류를받은 고마워요! – ubiquibacon

+7

다음을 사용하여이 값을 한 줄로 줄 이도록 할 수 있습니다 (체크 표시가 있으면 명시 적으로 건너 뜁니다). sortedList.sort {a, b -> a.author <=> b.author? : b.date <=> a.date} –

+2

@TedNaleid - 팁 고마워; 나는 그것을 줄이기로 생각했지만, 이해하기 쉽도록 남겨두기로 결정했다. 그래도 거기에 너를 넣을거야. –

관련 문제