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

