Kotlin中如何按动态时长区间对Route对象列表分组?
按动态时间区间分组Route列表的Kotlin实现
嘿,作为Kotlin新手碰到这个分组需求太正常了,其实用Kotlin标准库的groupBy就能轻松搞定,核心是给每个Route生成对应的区间键就行,我给你一步步拆解:
第一步:定义Route数据类
首先确保你的Route类属性是只读的(用val),这是Kotlin data class的最佳实践:
data class Route(val duration: Int)
第二步:编写区间计算函数
我们需要一个函数,输入duration,返回它所属的区间(比如5→0..9,31→30..39)。如果要支持动态调整区间大小,还可以把区间长度作为参数:
// 默认按10为区间间隔,也可以传入自定义值 fun getDurationInterval(duration: Int, intervalSize: Int = 10): IntRange { // 计算区间的起始值:比如31/10=3,3*10=30 val intervalStart = duration / intervalSize * intervalSize // 区间结束值是起始值+间隔-1,比如30+10-1=39 return intervalStart..intervalStart + intervalSize - 1 }
这个函数的逻辑很直观:用整数除法找到当前duration所在区间的起始点,再算出对应的结束点,返回一个IntRange作为分组键。
第三步:用groupBy完成分组
有了区间计算函数,直接调用groupBy,把每个Route映射到对应的区间即可:
fun main() { val routes = listOf(Route(5), Route(7), Route(31)) // 按默认10为间隔分组 val groupedRoutes = routes.groupBy { getDurationInterval(it.duration) } // 打印结果验证 println(groupedRoutes) // 输出:{0..9=[Route(duration=5), Route(duration=7)], 30..39=[Route(duration=31)]} }
动态调整区间的例子
如果想要改成按20为间隔分组,只需要传入第二个参数:
val groupedBy20 = routes.groupBy { getDurationInterval(it.duration, 20) } // 此时31会被分到20..39区间
本质上,groupBy的强大之处就在于键选择器函数的灵活性——你可以根据任何动态逻辑生成分组键,不管是固定间隔还是更复杂的规则,只要在函数里实现对应的映射就行。
内容的提问来源于stack exchange,提问作者Yonatan Karp-Rudin
相关产品推荐
相关产品推荐

