Kotlin如何基于日期衔接规则从现有列表创建分组列表
Kotlin按日期衔接分组列表元素
要实现将原列表中endDate与其他元素startDate衔接的元素分组,可以通过连通分量遍历的方式完成,以下是具体实现方案:
步骤说明
- 定义数据类承载元素的ID和日期信息
- 构建日期映射表,快速定位衔接元素
- 利用广度优先遍历收集所有连通的元素组
- 标记已处理元素,避免重复分组
完整代码示例
// 定义元素数据类 data class Item(val id: String, val startDate: Int, val endDate: Int) fun groupByDateSequence(items: List<Item>): List<List<Item>> { val processedItems = mutableSetOf<Item>() val resultGroups = mutableListOf<List<Item>>() // 构建日期映射:startDate -> 对应元素集合,endDate -> 对应元素集合 val startDateMap = items.groupBy { it.startDate } val endDateMap = items.groupBy { it.endDate } for (item in items) { if (item !in processedItems) { val currentGroup = mutableListOf<Item>() val traverseQueue = ArrayDeque<Item>().apply { add(item) } processedItems.add(item) // 广度优先遍历所有衔接元素 while (traverseQueue.isNotEmpty()) { val currentItem = traverseQueue.removeFirst() currentGroup.add(currentItem) // 查找以当前元素endDate为startDate的后续元素 startDateMap[currentItem.endDate]?.forEach { nextItem -> if (nextItem !in processedItems) { processedItems.add(nextItem) traverseQueue.add(nextItem) } } // 查找以当前元素startDate为endDate的前置元素 endDateMap[currentItem.startDate]?.forEach { prevItem -> if (prevItem !in processedItems) { processedItems.add(prevItem) traverseQueue.add(prevItem) } } } resultGroups.add(currentGroup) } } return resultGroups } // 测试示例 fun main() { val originalList = listOf( Item("id1", 1, 3), Item("id3", 5, 6), Item("id2", 3, 5), Item("id4", 10, 12), Item("id5", 12, 13), Item("id6", 13, 16) ) val groupedResult = groupByDateSequence(originalList) groupedResult.forEachIndexed { index, group -> println("分组 ${index + 1}: ${group.map { it.id }}") } // 输出: // 分组 1: [id1, id2, id3] // 分组 2: [id4, id5, id6] }
关键点解析
- 映射表优化:通过
groupBy构建日期到元素的映射,避免每次遍历整个列表查找衔接元素,大幅提升处理效率 - 广度优先遍历:确保所有直接或间接衔接的元素都被收集到同一组中,不受元素在原列表中的顺序影响
- 去重标记:用
MutableSet记录已处理元素,防止同一元素被加入多个分组
内容的提问来源于stack exchange,提问作者nnank12
相关产品推荐
相关产品推荐

