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

Kotlin如何将对象列表转换为指定层级结构的嵌套对象

Kotlin 实现扁平三级ID列表转指定嵌套结构

实现思路

核心逻辑是利用Kotlin标准库的groupBy方法按层级做分组:先按第一级ID聚合所有同属一个一级节点的数据,再在每个一级节点分组内按第二级ID做二次聚合,最后把每个二级节点下的所有三级ID收集成列表,逐层从叶子到根组装嵌套对象即可,整体是线性时间复杂度,没有额外依赖。

具体实现代码

1. 先定义对应的数据结构

首先定义原始扁平数据、目标嵌套结构的实体类,如果需要严格类型安全可以用密封类约束子节点类型:

// 原始输入的扁平数据结构
data class Temp(
    val id1: String,
    val id2: String,
    val id3: String
)

// 节点类型约束,用于实现编译期类型安全
sealed interface NestedNode

// 一、二级通用节点结构
data class CategoryNode(
    val id_: String,
    val children: List<NestedNode>
): NestedNode

// 三级叶子节点,存同属一个二级节点的所有三级ID
data class LeafIdCollection(
    val id: List<String>
): NestedNode

// 最外层包裹结构
data class ConvertResult(
    val cat: List<CategoryNode>
)

2. 核心转换逻辑

fun buildNestedStructure(rawList: List<Temp>): ConvertResult {
    // 按一级ID分组
    val level1Groups = rawList.groupBy { it.id1 }

    val level1Nodes = level1Groups.map { (level1Id, level1DataList) ->
        // 每个一级分组内,按二级ID分组
        val level2Groups = level1DataList.groupBy { it.id2 }

        val level2Nodes = level2Groups.map { (level2Id, level2DataList) ->
            // 收集当前二级分组下所有三级ID,组装叶子节点
            val level3IdList = level2DataList.map { it.id3 }
            CategoryNode(
                id_ = level2Id,
                children = listOf(LeafIdCollection(id = level3IdList))
            )
        }

        CategoryNode(
            id_ = level1Id,
            children = level2Nodes
        )
    }

    return ConvertResult(cat = level1Nodes)
}

3. 测试验证

fun main() {
    // 题目给出的测试数据
    val testRawData = listOf(
        Temp("I4509635", "I4406660", "I1111"),
        Temp("I4509635", "I4406660", "I2222"),
        Temp("I4509635", "I4406660", "I3333"),
        Temp("I4509635", "I1222233", "I14444")
    )

    val result = buildNestedStructure(testRawData)
    // 用任意Kotlin兼容的JSON序列化库(kotlinx-serialization、Gson、Jackson等)序列化result,
    // 输出的JSON结构和题目要求完全一致,题目给出的示例JSON存在引号缺失的笔误,序列化时会自动生成标准JSON格式
    println(result)
}

补充说明

  • 如果不需要严格类型校验,也可以把节点的children类型定义为List<Any>,省略密封类定义,写法更灵活但缺少编译期类型检查。
  • 该逻辑可以很方便扩展到更多层级,只需要对应增加分组层级、调整节点结构即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 12:06:26