Kotlin中如何从嵌套列表指定索引提取元素生成新列表
Kotlin 嵌套列表提取指定索引元素实现方案
基础实现
Kotlin 标准库的集合扩展函数可以直接满足需求,代码简洁且性能经过官方优化:
val list1 = listOf('a', 'b', 'c', 'e') val list2 = listOf(1, 2, 3, 4) val list3 = listOf('!', '@', '#', '$') val input = listOf(list1, list2, list3) val targetIndex = 2 // 核心逻辑,一行即可完成 val result = input.map { it[targetIndex] } println(result) // 输出:[c, 3, #]
安全增强版本
如果存在子列表长度小于目标索引的场景,可增加异常处理避免索引越界:
// 方案1:跳过长度不足的子列表,返回非空结果 val safeResult = input.mapNotNull { subList -> subList.getOrNull(targetIndex) } // 方案2:子列表长度不足时返回自定义默认值 val resultWithDefault = input.map { subList -> subList.getOrElse(targetIndex) { "缺省值" } }
性能相关说明
不存在本质上比遍历更优的实现方案。该需求需要访问外层列表中的每一个子列表来提取指定位置元素,时间复杂度固定为O(n)(n为外层列表长度),和遍历开销完全一致。
Kotlin 标准库的map函数底层做了成熟优化,和手动写for循环的性能没有明显差异,同时代码可读性更高,是更推荐的实现方式。
额外优化建议
- 若使用支持随机访问的列表实现(如
ArrayList),子列表索引访问开销为O(1),整体效率最高 - 若子列表为不支持随机访问的链表结构,单次索引访问开销为O(k)(k为目标索引值),高频操作场景下建议先调整数据结构降低访问开销
内容的提问来源于stack exchange,提问作者RanH
相关产品推荐
相关产品推荐

