2011-12-29 37 views
8

Tôi sắp xếp danh sách dựa trên nhiều trường.Làm cách nào để đảo ngược bộ sưu tập Groovy?

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

Điều này làm việc tốt, nhưng tôi muốn ngày bị đảo ngược và reverse() không hoạt động.

Làm cách nào để sắp xếp tác giả theo thứ tự tăng dần nhưng sắp xếp ngày theo thứ tự giảm dần (ngược lại)?

Ví dụ về những gì tôi muốn:

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

Ví dụ về những gì tôi có:

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

Trả lời

20

Đối với các loại đa sở hữu như thế này bạn sẽ nhận được sự kiểm soát nhất nếu bạn sử dụng sort() có đóng cửa hoặc một Công cụ so sánh, ví dụ:

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 
} 

Hoặc hơn thế nữa oncise phiên bản (kê biếu không của 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 
} 

Tôi chạy ở trên trong groovysh trên danh sách sau đây:

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

Và nhận được sắp xếp một cách chính xác:

[ 
    {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, cảm ơn rất nhiều! – ubiquibacon

+7

bạn cũng có thể rút ngắn điều này lên một lớp lót (và bỏ qua một kiểm tra rõ ràng nếu có) với: sortList.sort {a, b -> a.author <=> b.author?: B.date <=> a.date} –

+2

@TedNaleid - Cảm ơn vì tiền hỗ trợ; Tôi đã xem xét rút ngắn nó xuống, nhưng quyết định để nó vì lợi ích của sự hiểu biết. Tôi sẽ đưa bạn vào đó, mặc dù, cho đầy đủ. –

Các vấn đề liên quan