在 Kotlin 中展平数组

10

我有一个节点的二维数组,我想使用Kotlin数组的flatten函数将其展平为包含所有节点的单个数组。

    val nodes = kotlin.Array(width, { width ->
    kotlin.Array(height, { height -> Node(width, height) })
})

然后我尝试在这个二维数组上调用flatten函数。

nodes.flatten()

但是我遇到了一个错误:类型不匹配:推断类型为Array<Array<Node>>,但预期是Array<Array<out ???>>。 我应该用另一种方法吗?


请更精确地指定您的错误,并使用原始的错误信息。 - nhaarman
添加了实际的错误信息。 - Matt Mohandiss
2个回答

22

使用更通用的flatMap

nodes.flatMap {it.asIterable()}

10

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
}

1
同样的flatten方法也适用于列表。 - Zoe stands with Ukraine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接