如何基于另一个ArrayList的取值对Kotlin ArrayList进行指定顺序排序
Kotlin 按参考数组顺序自定义排序实现
首先先修正你提供的Java示例的参数错误:你实际要排序的是存储Name对象的列表,不是参考数组arrRef,以下是对应Kotlin实现:
基础实现(和Java逻辑完全对齐)
如果数据量不大,可以直接用indexOf匹配顺序,写法如下:
// 假设存储Name对象的列表变量名为nameList,参考数组为arrRef // 直接修改原列表排序 nameList.sortBy { arrRef.indexOf(it.title) } // 不修改原列表,返回新的排序后列表 val sortedNameList = nameList.sortedBy { arrRef.indexOf(it.title) }
高效优化实现(推荐)
基础实现中每次排序都要调用indexOf遍历参考数组,时间复杂度为O(n*m)(n为nameList长度,m为arrRef长度),数据量大时推荐先构建索引映射,将时间复杂度降到O(n+m):
// 先构建title到排序权重的映射,权重越小排序越靠前 val titleOrderMap = arrRef.withIndex().associate { (index, title) -> title to index } // 直接修改原列表排序 nameList.sortBy { titleOrderMap[it.title] ?: Int.MAX_VALUE } // 不修改原列表,返回新的排序后列表 val sortedNameList = nameList.sortedBy { titleOrderMap[it.title] ?: Int.MAX_VALUE }
代码中?: Int.MAX_VALUE是兜底逻辑,用于处理nameList中存在参考数组没有的title的场景,这类不匹配的元素会默认排在列表末尾,你可以根据业务需求调整兜底规则。
内容的提问来源于stack exchange,提问作者hodokeg
相关产品推荐
相关产品推荐

