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

