2011-12-29 9 views
8

मैं एकाधिक फ़ील्ड के आधार पर एक सूची क्रमबद्ध कर रहा हूं।ग्रोवी संग्रह के प्रकार को कैसे उलटया जाए?

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 

मैं क्या है का उदाहरण:

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

उत्तर

20

बहु संपत्ति प्रकार इस तरह आप सबसे अधिक नियंत्रण मिल जाएगा अगर आप sort() का उपयोग करें एक बंद या एक तुलनात्मक के साथ, उदाहरण के लिए:

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 
} 

या अधिक सी संस्करण oncise (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 
} 

मैं निम्नलिखित सूची पर groovysh में ऊपर दिखाया गया:

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

और प्राप्त सही ढंग से हल कर:

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

बहुत बढ़िया, आपका बहुत बहुत धन्यवाद! – ubiquibacon

+7

आप इसे एक लाइनर तक भी छोटा कर सकते हैं (और चेक के साथ स्पष्ट रूप से छोड़ें): sortedList.sort {a, b -> a.author <=> b.author?: B.date <=> a.date} –

+2

@TedNaleid - पारितोषिक के लिए धन्यवाद; मैंने इसे कम करने पर विचार किया था, लेकिन समझने के लिए इसे छोड़ने का फैसला किया। हालांकि, पूर्णता के लिए, मैं वहां तुम्हारा रखूंगा। –

संबंधित मुद्दे