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

Kotlin中嵌套对象列表排序并更新原列表的问题

嵌套MutableList排序失效的解决方案

1. 检查模型类是否包含排序依赖的name字段

你当前给出的ChildrenItem定义中没有name属性,但排序逻辑里用到了it?.name。如果实际代码中也缺失这个字段,排序时所有项的name都是null,自然无法得到预期的排序结果。补充name字段:

@Keep
data class ChildrenItem(
    @field:SerializedName("name")
    var name: String? = null, // 补充排序依赖的name字段
    @field:SerializedName("children")
    var children: MutableList<ChildrenItem?>? = mutableListOf(),
)

2. 递归处理所有层级的嵌套子项

你的代码只处理了ItemsItem -> ChildrenItem -> children这一层嵌套,如果ChildrenItem的子项还有更深层级的子列表,这些子项不会被排序。需要递归遍历所有层级:

// 递归排序工具函数
fun sortAllNestedChildren(childrenList: MutableList<ChildrenItem?>?) {
    childrenList?.run {
        // 按name忽略大小写排序,null值排在末尾
        sortWith(compareBy(nullsLast()) { it?.name?.lowercase() })
        // 递归排序每个子项的子列表
        forEach { child -> sortAllNestedChildren(child?.children) }
    }
}

// 调用排序
itemList.forEach { itemsItem ->
    sortAllNestedChildren(itemsItem?.children)
}

3. 确认列表的可修改性

如果接口返回的列表被包装成了不可变List(而非MutableList),调用sortBy会不生效甚至抛出异常。这种情况下需要先转为可修改列表再排序,然后重新赋值:

fun sortAllNestedChildren(childrenList: MutableList<ChildrenItem?>?) {
    childrenList?.let { originalList ->
        val sortedList = originalList.toMutableList().apply {
            sortWith(compareBy(nullsLast()) { it?.name?.lowercase() })
        }
        // 替换原列表
        originalList.clear()
        originalList.addAll(sortedList)
        // 递归处理子项
        sortedList.forEach { child -> sortAllNestedChildren(child?.children) }
    }
}

4. 验证排序逻辑的空值处理

如果存在大量name为null的项,默认的sortBy会把null排在最前面。如果需要调整null的位置,用sortWith配合nullsLast()或nullsFirst():

// null值排在最后
sortWith(compareBy(nullsLast()) { it?.name?.lowercase() })
// null值排在最前
sortWith(compareBy(nullsFirst()) { it?.name?.lowercase() })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 15:37:19