在Kotlin展平阵列

Mat*_*iss 7 arrays flatten multidimensional-array kotlin

我有一个二维节点数组,我希望使用Kotlin数组的flatten函数将其展平为所有节点的单个数组.

    val nodes = kotlin.Array(width, { width ->
    kotlin.Array(height, { height -> Node(width, height) })
})
Run Code Online (Sandbox Code Playgroud)

然后我尝试在2D数组上调用flatten函数

nodes.flatten()
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误:Type mismatch: inferred type is Array<Array<Node>> but Array<Array<out ???>> was expected.还有另一种方法我应该这样做吗?

vod*_*dan 13

使用更普遍flatMap:

nodes.flatMap {it.asIterable()}
Run Code Online (Sandbox Code Playgroud)


mfu*_*n26 9

Kotlin中的数组是不变的,所以Array<Array<Node>>不是Array<Array<out T>>(它是接收器类型flatten).

看起来这将在Kotlin 1.1中修复:放松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
}
Run Code Online (Sandbox Code Playgroud)