Создать динамический сортировщик компаратора из возврата API - PullRequest
1 голос
/ 21 октября 2019

У меня есть проблема, которую я действительно не могу решить .. Может быть, Вы можете мне помочь. Мне нужно отсортировать список объектов из возврата API, который содержит фильтры. Проблема заключается в том, что эти фильтры являются динамическими. Порядок объектов (проблемный фильтр):

class Order(val field : String, val direction: String)

Поле является атрибутом объекта (столбцом), направление может быть ASC или DESC. JSON может возвращать более одного фильтра, поэтому это может быть:

order : {
    field : "id",
    direction : "ASC"
        },
        {
    field : "creationDate"
    direction : "DESC"
        }

Проблема в том, что я не знаю, как создать динамическую функцию, которая может создать идеальную сортировку в моем списке. Я знаю, что должен сделать это:

return list.sortedWith(compareBy(List::id).thenByDescending(List::creationDate))

Но динамически .. вау

КТ

Ответы [ 2 ]

0 голосов
/ 21 октября 2019

Вы можете создать карту из имени свойства в компараторе, которая сравнивает заказы по этому свойству:

    val comparators = mapOf<String, Comparator<Order>>(
            "field" to compareBy { it.field },
            "direction" to compareBy { it.direction }
    )

Затем вы можете выбрать компараторы из этой карты по заданным именам свойств, изменив их порядок сортировки с помощьюComparator.reversed() функция расширения и, наконец, объединение всех этих компараторов в единый результирующий компаратор с функцией Comparator.then(Comparator):

    val givenOrder = listOf("field" to "ASC", "direction" to "DESC")

    val resultingOrder = givenOrder
        .map { (fieldName, direction) -> 
            comparators[fieldName]!!.let { if (direction == "DESC") it.reversed() else it }
        }
        .reduce { order, nextComparator -> order.then(nextComparator) } 

    val sortedList = list.sortedWith(resultingOrder)
0 голосов
/ 21 октября 2019

Я предполагаю, что второй порядок олим относится к тем, где первое имеет то же значение sortedWith + compareBy

compareBy дублейvararg селекторов, который является просто массивом, так что его можно построитьсоздать селекторы

также смотрите этот ответ: Сортировать коллекцию по нескольким полям в Kotlin

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