Kotlin(JVM)保留二维索引的二维列表扁平化实现方法
Kotlin 扁平化二维列表并保留二维索引的惯用写法
要实现保留二维索引的扁平化操作,直接组合Kotlin标准库的withIndex()和flatMap()就能完成,完全符合语言习惯:
方法一:使用标准三元组(Triple)
val twoDList = listOf( listOf("a", "b", "c"), listOf("d", "e"), listOf("f", "g", "h", "i") ) // 扁平化并保留二维索引 val flattened = twoDList.withIndex() .flatMap { (rowIdx, rowElements) -> rowElements.withIndex() .map { (colIdx, element) -> Triple(rowIdx, colIdx, element) } }
逻辑说明:
- 外层通过
withIndex()为每一行绑定行索引 - 用
flatMap替代普通map,直接将每行的处理结果合并为单层列表 - 内层再通过
withIndex()为每个元素绑定列索引,最后用Triple打包行索引、列索引和元素值
方法二:自定义数据类(更具语义化)
如果觉得Triple的可读性不足,可以自定义数据类封装索引和元素,让代码意图更清晰:
// 自定义数据类,明确语义 data class Indexed2DElement<T>( val row: Int, val column: Int, val value: T ) val twoDList = listOf( listOf("a", "b", "c"), listOf("d", "e"), listOf("f", "g", "h", "i") ) val flattened = twoDList.withIndex() .flatMap { (rowIdx, rowElements) -> rowElements.withIndex() .map { (colIdx, element) -> Indexed2DElement(rowIdx, colIdx, element) } }
这种写法在复杂业务场景下更易维护,从数据类的名称和字段名就能直接理解每个值的含义。
内容的提问来源于stack exchange,提问作者Zabuzard
相关产品推荐
相关产品推荐

