Как динамически сортировать по разным полям в разных порядках в Groovy - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь отсортировать 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 значения

Все работает нормально, если поля сортировки содержат числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...