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
相关产品推荐
相关产品推荐

