Kotlin:Arrayの初期化~Androidアプリ開発の勉強中

  Android Studio&Kotlinを使ったスマーホ用アプリの開発について、覚えたことをメモしておきます。今回は、配列「Array型」の初期化方法です。


★Arrayを使う
 Kotlinでは、基本的に、変数の宣言時に、同時に初期化(初期値の代入)をします。配列「Array型」の場合は、複数の要素を、同時に初期化する必要があります。その方法をまとめました。


◎基本的な方法
 直接的に、要素をすべて指定する方法です。要素数が少ない場合は、これが簡単です。この宣言中では、配列の要素数を指示する必要はありません。

//要素を個別に指定して初期化
val array01: Array<Int> = arrayOf(1, 2, 3) //型を明示的に指定:Int
val array02 = arrayOf(1, 2, 3) //型を自動指定:Int
val array03 = arrayOf(1.0F, 2.0F, 3.0F) //型を自動指定:Float

//contentToString()を使うと、すべての要素を一括で確認できる。
println("array01=${array01.contentToString()}")
println("array02=${array02.contentToString()}")
println("array03=${array03.contentToString()}")


◎要素が多いとき
 要素が多い時は、配列のサイズと初期値を与えて、初期化が可能です。下の例では、要素数が10個で、値がすべて0の配列を宣言します。サイズを()内、初期値を{}内に書きます。型は{}内の値で決まり、この例ではIntになります。
//要素を一括指定して初期化
val array11 = Array(10) { 0 }
println("array11=${array11.contentToString()}")

 インデックス番号ごとに要素の値が異なるときは、式を使っての初期化が可能です。{}内は、ラムダ式(Lambda expression)です。下の例では、インデックスi=0~9の要素に対して、要素の値はi+1になります。
//要素を式で指定して初期化
val array12 = Array(10) { i ->
    i + 1
}
println("array12=${array12.contentToString()}")


◎サイズを後から決める
 サイズを後から決めたいときは、「lateinit」を使います。下の例では、後からサイズ(nn)が決まったところで、要素に値を代入しています。代入には、ラムダ式を使うと、一括で設定できて便利です。
//後からサイズや中身を決める
lateinit var array31: Array<Float>
val nn = 5
array31 = Array(nn) { i ->
     (i + 1).toFloat() / nn
}
println("array31=${array31.contentToString()}")

◎他の配列を利用
 他の配列の値によって、別の配列の値を設定することもできます。下の例では、既存の配列の係数倍の値を、新しい配列の値としています。
//他の配列を使用して値を決める
lateinit var array32: Array<Float>
val k = 2
array32 = Array(nn) { i ->
     array31[i] * k
}
println("array32=${array32.contentToString()}")


◎カスタムの型の初期化
 自分で定義した型を使った場合の、初期化の方法です。下の例では、要素xとyを持つ、XyDataというクラスを使っています。最初の初期化の方法は、arrayOfを使って、個別に要素を羅列する方法です。
//Arrayについて:その2
//Array化するクラス
class XyData(var x: Float = 0.0F, var y: Float = 0.0F) {
     var memo: String? = null
}
//個別に要素を設定
val array61 = arrayOf(
     XyData(1.0F, 2.0F),
     XyData(2.0F, 3.0F),
     XyData(2.0F, 4.0F)
)
//forEachIndexedを使うと、配列の各要素にアクセスできる
array61.forEachIndexed { i, dat ->
     println("array61[$i]=${dat.x},${dat.y},${dat.memo}")
}

◎ラムダ式による初期化
 ラムダ式を使った初期化もできます。インデックス番号の式として、以下のように書けばOKです。
//数式による設定
val array62 = Array(3) { i ->
     XyData(i.toFloat(), 0.0F)
}
array62.forEachIndexed { i, dat ->
     println("array62[$i]=${dat.x},${dat.y},${dat.memo}")
}

◎applyを使った初期化
 直接には値を与えられない、クラス定義の()外の要素については、applyを使うのが便利です。以下のようにすれば、要素memoも、まとめて初期化できます。
//applyを用いて引数外の要素を設定
val array63 = Array(3) { i ->
     XyData(i.toFloat(), i.toFloat() * 2).apply {
          memo = "memo:i=$i"
     }
}
array63.forEachIndexed { i, dat ->
     println("array63[$i]=${dat.x},${dat.y},${dat.memo}")
}


以上終わり。

Comments

Popular posts from this blog

Privacy Policy: LifePointer - a life counter for TCGs

Privacy Policy: Absolute FFT - visualize frequency of sounds

Privacy Policy: Head or Tail? - An App for Tossing Coins