首页 > 解决方案 > Kotlin根据内部列表中的参数对列表进行排序

问题描述

我有一个列表列表,我想根据内部列表中的日期值对其进行排序。这是我的清单示例:

ClassA(id: String, classb : List<ClassB>)和 ClassB 是ClassB(id: String, date: Date)所以我有 ClassA 列表,其中还包含 ClassB 列表,我想根据内部 classB 中日期的降序对列表进行排序/排序

标签: androidlistkotlin

解决方案


假设如下:

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-objects 的新列表...如果您不希望这样做,这仍然可以作为起点):

    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))
    

推荐阅读