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
Post a Comment