Kotlin配列(Array)の宣言、初期化、主な関数

配列を宣言して初期化する方法を紹介する。

配列(Array)

arrayOf()で配列を作成する。配列の要素数は固定だが、性能に優れている。

fun main() {
    val nums = arrayOf(1, 2, 3)
    val cols = arrayOf("Red", "Green", "Blue")

    for (n in nums) { println(n) }
    for (c in cols) { println(c) }
}

Output:

1
2
3
Red
Green
Blue

次のように変数宣言時にArray<Int>型を指定すると、後ろ側の型は<>で省略できる。

val array: Array<Int> = emptyArray<>()

角括弧[...]で配列の要素にアクセスでき、配列のインデックスは0から始まる。

println(nums[0])
println(cols[1])

空(Empty)の配列宣言

次の関数で特定の型の空配列を宣言できる。

val array1 = emptyArray<Int>()
val array2 = arrayOf<Int>()
fun main() {
    val array1 = emptyArray<Int>()
    println("array1: ${array1.contentToString()}")

    val array2 = arrayOf<Int>()
    println("array2: ${array2.contentToString()}")
}

Output:

array1: []
array2: []

配列宣言時に初期値を設定する

arrayOf<Type>(values)で配列に初期値を設定できる。 このとき、(values)から型を推論できるため、<Type>は省略できる。

fun main() {
    val array1 = arrayOf<Int>(1, 2, 3, 4)
    println("array1: ${array1.contentToString()}")

    val array2 = arrayOf("Red", "Green", "Blue")
    println("arr: ${array2.contentToString()}")
}

Output:

array1: [1, 2, 3, 4]
array2: [Red, Green, Blue]

同じ値で配列を初期化する

Array(size) { value }は、sizeで指定した大きさの配列を作成し、すべての要素に指定したvalueを代入する。

fun main() {
    val array = Array(3) { 20 }
    println("array: ${array.contentToString()}")
}

Output:

array: [20, 20, 20]

連続した数値で配列を初期化する

Array(size) { lambda }は、sizeで指定した大きさの配列を作成し、すべての要素にlambdaの戻り値を設定する。

lambdaに渡されるitは要素のindex値になるため、次のように連続した数値で配列を初期化できる。

fun main() {
    val array1 = Array(5) { it -> it }
    println("array1: ${array1.contentToString()}")

    val array2 = Array(5) { it -> it + 10 }
    println("array2: ${array2.contentToString()}")
}

Output:

array1: [0, 1, 2, 3, 4]
array2: [10, 11, 12, 13, 14]

Nullで配列を初期化する

arrayOfNulls<Type>(size)nullで埋められた配列を作成できる。

fun main() {
    val array = arrayOfNulls<Int>(5)
    println("array: ${array.contentToString()}")
}

Output:

array: [null, null, null, null, null]

基本型配列の宣言

KotlinにはIntArrayBooleanArrayDoubleArrayLongArrayなどの基本型配列が用意されている。

このような配列を作成するときは、intArrayOf()booleanArrayOf()などを使用できる。

fun main() {
    val iniArray: IntArray = intArrayOf(1, 2, 3)
    println("iniArray: ${iniArray.contentToString()}")

    val booleanArray: BooleanArray = booleanArrayOf(true, true, false)
    println("booleanArray: ${booleanArray.contentToString()}")

    val doubleArray: DoubleArray = doubleArrayOf(1.2, 2.3, 3.4)
    println("doubleArray: ${doubleArray.contentToString()}")
}

Output:

iniArray: [1, 2, 3]
booleanArray: [true, true, false]
doubleArray: [1.2, 2.3, 3.4]

主な関数

forEach関数

forEach関数はリストに対して反復処理を行える。

fun main() {
    val array = arrayOf(1, 2, 3, 4, 5)

    // lambdaとして使用する方法である。
    array.forEach({ element ->
        print("$element,")
    }) // => 1,2,3,4,5
    println()

    // 括弧'()'は省略できる。
    array.forEach { element ->
        print("$element,")
    }
    println()

    // itでラムダの代わりにオブジェクトを受け取れる。
    array.forEach {
        print("$it,")
    } // => 1,2,3,4,5
}

Output:

1,2,3,4,5,
1,2,3,4,5,
1,2,3,4,5,

filter関数

filter関数はリストに条件をかけ、その条件に一致する新しいリストを返す。

fun main() {
    val array = arrayOf(1, 2, 3, 4, 5) // => 1,2,3,4,5の配列を作成する。

    // filterの条件を満たす要素を返す。
    array.filter({ e -> e % 2 == 0 }).forEach { println(it) } // => 2,4

    // 括弧'()'は省略できる。
    array.filter { e -> e % 2 == 0 }.forEach { println(it) } // => 2,4

    // lambdaを使わなくても'it'でオブジェクトを受け取れる。
    array.filter { it % 2 == 0 }.forEach { println(it) } // => 2,4

}

Output:

2,4,
2,4,
2,4,

map関数

map関数はリストの要素を変換して受け取ることができる。

// 名前と年齢を持つクラス定義
private class Person(val name: String, val age: Int)

fun main() {
    val array = arrayOf(
        Person("Charlie", 20),
        Person("devkuma", 31),
        Person("kimkc", 42),
    )

    // lambdaでuserインスタンスを受け取れる。
    array.map({ user -> user.name }).forEach { print("${it},") }
    println()

    // 括弧'()'は省略できる。
    array.map { user -> user.name }.forEach { print("${it},") }
    println()

    // 'it'でオブジェクトを受け取れる(この'it'はuserインスタンスを指す)。
    array.map { it.name }.forEach { print("${it},") }
}

Output:

Charlie,devkuma,kimkc,
Charlie,devkuma,kimkc,
Charlie,devkuma,kimkc,

sum関数

sum関数は入力した数値を合計する。

fun main() {
    // Array<Int>インスタンスを作成する。
    val array = arrayOf(1, 2, 3, 4, 5)

    // 合計する(1 + 2 + 3 + 4 + 5)。
    println(array.sum()) // => 15
}

Output:

15

take関数

take関数はリストの要素を入力した数だけ取得する。

fun main() {
    val array = arrayOf(1, 2, 3, 4, 5)
    array.take(1).forEach { print(it) } // => 1
    println()
    array.take(2).forEach { print(it) } // => 1, 2
    println()
    array.take(3).forEach { print(it) } // => 1, 2, 3
    println()
    array.take(4).forEach { print(it) } // => 1, 2, 3, 4
    println()
    array.take(5).forEach { print(it) } // => 1, 2, 3, 4, 5
}

Output:

1
12
123
1234
12345

drop関数

drop関数はリストの要素を先頭から入力した数だけ削除し、残りを取得する。

fun main() {
    val array = arrayOf(1, 2, 3, 4, 5)
    array.drop(1).forEach{print(it)} // => 2, 3, 4, 5
    println()
    array.drop(2).forEach{print(it)} // => 3, 4, 5
    println()
    array.drop(3).forEach{print(it)} // => 4, 5
    println()
    array.drop(4).forEach{print(it)} // => 5
    println()
    array.drop(5).forEach{print(it)} // => 空のArray
}

Output:

2345
345
45
5