Как поменять коллекцию Groovy? - PullRequest
8 голосов
/ 30 декабря 2011

Я сортирую список по нескольким полям.

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

1 Ответ

20 голосов
/ 30 декабря 2011

Для сортировки с несколькими свойствами, подобной этой, вы получите максимальный контроль, если будете использовать 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
}

Или более краткая версия (предоставлено Тедом Нейлидом ):

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}
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...