Как я могу отсортировать таблицу на основе двух полей, используя Anko в Kotlin? - PullRequest
0 голосов
/ 16 ноября 2018

Я использую Anko для работы с таблицей SQLite, я надеюсь отсортировать список сначала по полю isFavorite, затем по createdDate

Например, введите Исходные данные , и я получу Данные результата сортировки

Но код return myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate} не может получить правильный результат, как я могу это исправить?

Исходные данные

enter image description here

Сортировать данные результатов (надеюсь получить)

enter image description here

Структура

data class MRecord (
    var _id: Long,     
    var isFavorite: Bool,   
    var createdDate: Long
)

Код

var myList=select(tableName).parseList { MDBRecord(HashMap(it)) }        
return myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate}

Добавленный контент

Безумцу: Спасибо!

data class MRecord(
    var id: Long,
    var isFavorite: Long,
    var createdDate: Long
)


val list = listOf(
        MRecord(1, 1, 100),
        MRecord(2, 0, 200),
        MRecord(3, 1, 300)
)

Я надеюсь получить результат

1, 1, 100
3, 1, 300
2, 0, 200

но код println(list.sortedWith(compareBy({ !it.isFavorite }, MRecord::createdDate))) не будет работать, потому что isFavorite - это Long, как я могу это исправить?

1 Ответ

0 голосов
/ 16 ноября 2018

Вы правы, myList.sortedBy{it.isFavorite}.sortedBy{ it.createdDate} не даст вам правильных результатов, потому что оно в основном равно myList.sortedBy{ it.createdDate} (применяется только последняя сортировка). Вам нужен компаратор, который учитывает несколько полей и выглядит так: compareBy - это то, что вам нужно:

Создает компаратор, используя последовательность функций для вычисления результата сравнения. Функции вызываются последовательно, получают заданные значения a и b и возвращают сопоставимые объекты. Как только экземпляры Comparable, возвращаемые функцией для значений a и b, не сравниваются как равные, результат этого сравнения возвращается из Comparator.

Итак, проверьте это:

data class MRecord(
    var id: Long,
    var isFavorite: Boolean,
    var createdDate: Long
)

fun main(args: Array<String>) {
    val list = listOf(
        MRecord(1, true, 10),
        MRecord(2, false, 20),
        MRecord(3, true, 30)
    )

    println(list)

    println(list.sortedWith(compareBy({ !it.isFavorite }, MRecord::createdDate)))
}

Обратите внимание, как вы можете смешивать лямбды и ссылки на функции.

Изменить для Long isFavorite :

data class MRecord(
    var id: Long,
    var isFavorite: Long,
    var createdDate: Long
)

fun main(args: Array<String>) {
    val list = listOf(
        MRecord(1, 1, 100),
        MRecord(2, 0, 200),
        MRecord(3, 1, 300)
    )

    println(list.sortedWith(compareByDescending<MRecord> { it.isFavorite }.then(compareBy(MRecord::createdDate))))
}
...