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

Kotlin如何基于日期衔接规则从现有列表创建分组列表

Kotlin按日期衔接分组列表元素

要实现将原列表中endDate与其他元素startDate衔接的元素分组,可以通过连通分量遍历的方式完成,以下是具体实现方案:

步骤说明

  1. 定义数据类承载元素的ID和日期信息
  2. 构建日期映射表,快速定位衔接元素
  3. 利用广度优先遍历收集所有连通的元素组
  4. 标记已处理元素,避免重复分组

完整代码示例

// 定义元素数据类
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:33:19