Kotlin сортировать список списка на основе параметра во внутреннем списке - PullRequest
1 голос
/ 24 сентября 2019

У меня есть список списка, который я хочу отсортировать на основе значения даты во внутреннем списке.Вот пример моего списка:

ClassA(id: String, classb : List<ClassB>) и ClassB равен ClassB(id: String, date: Date), поэтому у меня есть список ClassA, который также содержит список ClassB, и я хочу упорядочить / отсортировать список по убыванию дат во внутреннем classB

Ответы [ 2 ]

0 голосов
/ 24 сентября 2019

Предполагая следующее:

val int = AtomicInteger(0)
data class A(val bs: List<B>, val id: Int = int.incrementAndGet())
data class B(val date: LocalDate, val id: Int = int.incrementAndGet())

и список (listOfA) следующим образом:

A(bs=[B(date=2019-09-24, id=1), B(date=2019-09-25, id=2), B(date=2019-09-23, id=3)], id=4)
A(bs=[B(date=2019-09-21, id=5), B(date=2019-09-22, id=6), B(date=2019-09-23, id=7)], id=8)
A(bs=[B(date=2019-09-19, id=9), B(date=2019-09-23, id=10), B(date=2019-09-29, id=11)], id=12)
  1. упорядочивание только элементов класса B(на самом деле я создаю новый список с совершенно новыми A -объектами ... если вы этого не хотите, это все равно может служить отправной точкой):

    val listOfAWithOrderedB = listOfA.map {
      it.copy(bs = it.bs.sortedByDescending(B::date))
    }
    

    , что приводит к:

    A(bs=[B(date=2019-09-25, id=2), B(date=2019-09-24, id=1), B(date=2019-09-23, id=3)], id=4)
    A(bs=[B(date=2019-09-23, id=7), B(date=2019-09-22, id=6), B(date=2019-09-21, id=5)], id=8)
    A(bs=[B(date=2019-09-29, id=11), B(date=2019-09-23, id=10), B(date=2019-09-19, id=9)], id=12)
    
  2. упорядочение по всем B -датам и сохранение ссылки на фактические A:

    val bSortedByDateAndTheirA = listOfA.flatMap { anA ->
      anA.bs.map {
        it to anA
      }
    }
        .sortedByDescending { (b) -> b.date }
    

    , что приводит к List<Pair<B, A>> (снова... возможная отправная точка) следующим образом:

    (B(date=2019-09-29, id=11), A(bs=[B(date=2019-09-19, id=9), B(date=2019-09-23, id=10), B(date=2019-09-29, id=11)], id=12))
    (B(date=2019-09-25, id=2), A(bs=[B(date=2019-09-24, id=1), B(date=2019-09-25, id=2), B(date=2019-09-23, id=3)], id=4))
    (B(date=2019-09-24, id=1), A(bs=[B(date=2019-09-24, id=1), B(date=2019-09-25, id=2), B(date=2019-09-23, id=3)], id=4))
    (B(date=2019-09-23, id=3), A(bs=[B(date=2019-09-24, id=1), B(date=2019-09-25, id=2), B(date=2019-09-23, id=3)], id=4))
    (B(date=2019-09-23, id=7), A(bs=[B(date=2019-09-21, id=5), B(date=2019-09-22, id=6), B(date=2019-09-23, id=7)], id=8))
    (B(date=2019-09-23, id=10), A(bs=[B(date=2019-09-19, id=9), B(date=2019-09-23, id=10), B(date=2019-09-29, id=11)], id=12))
    (B(date=2019-09-22, id=6), A(bs=[B(date=2019-09-21, id=5), B(date=2019-09-22, id=6), B(date=2019-09-23, id=7)], id=8))
    (B(date=2019-09-21, id=5), A(bs=[B(date=2019-09-21, id=5), B(date=2019-09-22, id=6), B(date=2019-09-23, id=7)], id=8))
    (B(date=2019-09-19, id=9), A(bs=[B(date=2019-09-19, id=9), B(date=2019-09-23, id=10), B(date=2019-09-29, id=11)], id=12))
    
0 голосов
/ 24 сентября 2019

вы можете использовать Comparator , чтобы использовать это ... вот пример кода, который вы можете использовать

Объект Comparator

companion object : Comparator<MyDate> {

override fun compare(a: MyDate, b: MyDate): Int = when {
    a.year != b.year -> a.year - b.year
    a.month != b.month -> a.month - b.month
    else -> a.day - b.day
}}

дата модели класса

data class MyDate (val year: Int, val month: Int, val day: Int) {}

и вот как вы можете выполнить сортировку

fun main(args: Array<String>) {
val myDates = listOfdays
myDates.sortedWith(CompareObjects).forEach { 

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