Вы можете сортировать по нескольким условиям (полей, свойств и т. д.) ...
- Сравнение первого свойства
- Если первые результаты сравнения свойств в 0 (что означает, что они равны), продолжайте следующее свойство. В противном случае рассмотрите два отсортированных элемента.
Вот замыкание, которое может быть curry'ed со списком имен свойств, а затем перешел к Iterable.sort(boolean, Closure)
или Iterable.toSorted(Closure)
.
def sortByProperties = { List propertyNames, Object a, Object b ->
propertyNames
.collect { a[it] <=> b[it] }
.find { it != 0 }
}
Пример
Вот как использовать замыкание.
def date1 = new Date() + 3
def date2 = new Date() - 2
def list = [
[date: date1, xrefCode: 2, lineType: 'b'],
[date: date2, xrefCode: 2, lineType: 'c'],
[date: date2, xrefCode: 1, lineType: 'c'],
[date: date1, xrefCode: 2, lineType: 'a']
]
def sortByProperties = { List propertyNames, Object a, Object b ->
propertyNames
.collect { a[it] <=> b[it] }
.find { it != 0 }
}
// This form requires Groovy >= 2.4
def sortedList = list.toSorted(sortByProperties.curry(['date', 'xrefCode', 'lineType']))
// An alternative.
def sortedList = list.sort(false, sortByProperties.curry(['date', 'xrefCode', 'lineType']))
Результат выглядит следующим образом.
[
[date:Tue Oct 06 20:13:13 EDT 2015, xrefCode:1, lineType:c],
[date:Tue Oct 06 20:13:13 EDT 2015, xrefCode:2, lineType:c],
[date:Sun Oct 11 20:13:13 EDT 2015, xrefCode:2, lineType:a],
[date:Sun Oct 11 20:13:13 EDT 2015, xrefCode:2, lineType:b]
]
Я думаю, что более чистый код выйдет, просто используя критерии. – Neoryder