Я пытаюсь отсортировать POJO по нескольким полям с разными порядками сортировки, используя groovy
. Имена полей заранее неизвестны.
Я использую следующий код, который пытается отсортировать список на основе поля delLoc
в порядке desc
(с добавлением -
впереди) и затем на id
поле в asc
порядке.
import groovy.transform.ToString
@ToString()
class SLoad {
String id
String delLoc
int date
}
//String.metaClass.negative { return delegate?.isNumber() ? -delegate?.toInteger() : 0 } //To enable sorting on Strings in descending order
def lst = [
new SLoad(id: '1005', delLoc: 'EMS', date: 1),
new SLoad(id: '1004', delLoc: '1-EMS', date: 2),
new SLoad(id: '1006', delLoc: '2-EMS', date: 1),
new SLoad(id: '1013', delLoc: '2-EMS', date: 7),
new SLoad(id: '1002', delLoc: '9-EMS', date: 8),
new SLoad(id: '1001', delLoc: '7-EMS', date: 9),
]
def ccls = ['-delLoc', 'id'].collect {
if(it?.startsWith('-')) {
return { target-> -target."${it.substring(1)}" }
} else {
return { target-> target."${it}" }
}
}
lst.sort(true, new OrderBy(ccls))
Я получаю следующую ошибку при использовании этого подхода, если в POJO указано поле String No signature of method: java.lang.String.negative() is applicable for argument types: () values
Итак, для преодоления я добавил negative
метод для String
класса с использованием meta-programming
возможностей groovy, как следует
String.metaClass.negative { return delegate?.isNumber() ? -delegate?.toInteger() : 0 }
Я не могу отсортировать по убыванию, используя этот подход, когда поле сортировки содержит String
значения
Все работает нормально, если поля сортировки содержат числа.