You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何按双条件对Schedule对象列表排序?

Kotlin Schedule列表多条件排序问题解决

首先要指出:你给出的预期结果和描述的排序条件存在矛盾。根据你写的两个排序规则:

  • 规则1:examCodes数量越多的Schedule越靠前
  • 规则2:数量相同时,日期更早的Schedule越靠前

按照这两个规则,正确的排序结果应该是:

Schedule(id=6, date=2023-07-24, examCodes=[C, B, A]), // 3个考试(数量最多)
Schedule(id=4, date=2023-07-10, examCodes=[A, B]),    // 2个考试,日期更早
Schedule(id=5, date=2023-07-15, examCodes=[B, C]),    // 2个考试,日期较晚
Schedule(id=1, date=2023-07-05, examCodes=[A]),        // 1个考试
Schedule(id=2, date=2023-07-06, examCodes=[B]),        // 1个考试
Schedule(id=3, date=2023-07-07, examCodes=[C])         // 1个考试

但你提供的预期结果里,拥有3个考试的Schedule(id=6)却排在只有2个考试的条目后面,这说明你要么是预期结果写错了,要么实际需求是**examCodes数量越少的越靠前**。


匹配你描述的规则的实现

如果确实需要按「数量多优先,同数量则日期早优先」排序,你尝试的第二种写法是完全正确的:

val sortedSchedules = schedules.sortedWith(
    compareByDescending<Schedule> { it.examCodes.size }
        .thenBy { it.date }
)

这段代码先对examCodes.size做降序排序(数量多的在前),当size相同时,再对date做升序排序(日期早的在前),完全符合你描述的两个条件。


匹配你给出的预期结果的实现

如果你实际需要的是「数量少优先,同数量则日期早优先」(对应你提供的预期输出),只需要把排序条件改为升序排列size:

val sortedSchedules = schedules.sortedWith(
    compareBy<Schedule> { it.examCodes.size }
        .thenBy { it.date }
)

运行这段代码后,得到的结果就是你给出的预期排序。


验证代码

可以用以下代码直接验证两种排序的结果:

import java.time.LocalDate

data class Schedule(
    val id: Int,
    val date: LocalDate,
    val examCodes: List<String>
)

fun main() {
    val schedules = listOf(
        Schedule(id=1, date = LocalDate.parse("2023-07-05"), examCodes = listOf("A")),
        Schedule(id=2, date = LocalDate.parse("2023-07-06"), examCodes = listOf("B")),
        Schedule(id=3, date = LocalDate.parse("2023-07-07"), examCodes = listOf("C")),
        Schedule(id=4, date = LocalDate.parse("2023-07-10"), examCodes = listOf("A", "B")),
        Schedule(id=5, date = LocalDate.parse("2023-07-15"), examCodes = listOf("B", "C")),
        Schedule(id=6, date = LocalDate.parse("2023-07-24"), examCodes = listOf("C", "B", "A"))
    )

    // 按「数量多->日期早」排序
    val sortedBySizeDesc = schedules.sortedWith(
        compareByDescending<Schedule> { it.examCodes.size }.thenBy { it.date }
    )
    println("按数量多优先排序结果:")
    sortedBySizeDesc.forEach { println(it) }

    // 按「数量少->日期早」排序(匹配你的预期)
    val sortedBySizeAsc = schedules.sortedWith(
        compareBy<Schedule> { it.examCodes.size }.thenBy { it.date }
    )
    println("\n按数量少优先排序结果(匹配预期):")
    sortedBySizeAsc.forEach { println(it) }
}

内容的提问来源于stack exchange,提问作者user2620925

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 04:57:07