在 Kotlin 中展平数组
Flatten array in Kotlin
我有一个二维节点数组,我想使用 Kotlin 数组的展平函数将其展平成所有节点的单个数组。
val nodes = kotlin.Array(width, { width ->
kotlin.Array(height, { height -> Node(width, height) })
})
然后我尝试在二维数组上调用展平函数
nodes.flatten()
但我得到一个错误:Type mismatch: inferred type is Array<Array<Node>> but Array<Array<out ???>> was expected
。还有其他方法吗?
Kotlin 中的数组是 invariant,因此 Array<Array<Node>>
不是 Array<Array<out T>>
(这是 flatten
的接收器类型)。
看起来这将在 Kotlin 1.1 中得到修复:Relax generic variance in Array.flatten · JetBrains/kotlin@49ea0f5。
在 Kotlin 1.1 发布之前,您可以维护自己的 flatten
版本:
/**
* Returns a single list of all elements from all arrays in the given array.
*/
fun <T> Array<out Array<out T>>.flatten(): List<T> {
val result = ArrayList<T>(sumBy { it.size })
for (element in this) {
result.addAll(element)
}
return result
}
使用更通用的flatMap
:
nodes.flatMap {it.asIterable()}
我有一个二维节点数组,我想使用 Kotlin 数组的展平函数将其展平成所有节点的单个数组。
val nodes = kotlin.Array(width, { width ->
kotlin.Array(height, { height -> Node(width, height) })
})
然后我尝试在二维数组上调用展平函数
nodes.flatten()
但我得到一个错误:Type mismatch: inferred type is Array<Array<Node>> but Array<Array<out ???>> was expected
。还有其他方法吗?
Kotlin 中的数组是 invariant,因此 Array<Array<Node>>
不是 Array<Array<out T>>
(这是 flatten
的接收器类型)。
看起来这将在 Kotlin 1.1 中得到修复:Relax generic variance in Array.flatten · JetBrains/kotlin@49ea0f5。
在 Kotlin 1.1 发布之前,您可以维护自己的 flatten
版本:
/** * Returns a single list of all elements from all arrays in the given array. */ fun <T> Array<out Array<out T>>.flatten(): List<T> { val result = ArrayList<T>(sumBy { it.size }) for (element in this) { result.addAll(element) } return result }
使用更通用的flatMap
:
nodes.flatMap {it.asIterable()}