2017-01-04 12 views
2

私は、Kotlin配列のflatten関数を使用して、すべてのノードの単一の配列に平面化したいノードの2次元配列を持っています。Kotlinでの配列の整列

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

私は、2次元配列

nodes.flatten() 

にフラット化機能を呼び出そうが、私はエラーを取得:Type mismatch: inferred type is Array<Array<Node>> but Array<Array<out ???>> was expectedを。私はこれをやるべき別の方法がありますか?

+0

元のエラーメッセージを使用して、より正確にあなたのエラーを指定しKotlin 1.1まで

はあなたがflattenのあなた独自のバージョンを維持することができる解放されます。 – nhaarman

+0

は実際のエラーメッセージを追加しました –

答えて

6

コトルの配列はinvariantであるので、Array<Array<Node>>Array<Array<out T>>(これはflattenのレシーバタイプ)ではありません。

これは、Kotlin 1.1:Relax generic variance in Array.flatten · JetBrains/[email protected]で修正されるようです。

/** 
* 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 
} 
3

より普遍的なflatMapを使用します:

nodes.flatMap {it.asIterable()}