Массивы в Kotlin

В Kotlin имеются "классические" массивы, когда в одном массиве могут быть данные только одного типа, и в массив нельзя добавлять элементы, как в список.

Объявление массива:

Объявление массива в Kotlin

Массивы обычно объявляют с помощью val, но это не значит, что нельзя изменять значение элементов массива. Неизменяемой переменной можно присвоить массив только единожды. Var-переменной можно присвоить новый массив.

Инициализация массива возможна как с помощью функций, так и конструкторов классов. В примере ниже используется встроенная функция arrayOf(), которой передается набор значений.

fun main() {
    val a: Array<Int> = arrayOf(9, 3, 4)
 
    println(a.size)
 
    a[0] = 10
 
    for (i in a) {
        println(i)
    }
}

Для измерения длины массива используется свойство класса size.

Инициация трех элементов массива нулем при использовании конструктора класса:

fun main() {
    val a: Array<Int> = Array(3) {0}
    a[0] = 5
 
    for (i in a) {
        println(i)
    }
}

Конструктор класса Array принимает в качестве второго аргумента лямбда-выражение, которое заключается в фигурные скобки, оно генерирует значения. Такие аргументы в Kotlin обычно выносят за круглые скобки.

При запросе элементов и изменении их значений используется обычный для массивов синтаксис с квадратными скобками. В классе их переопределяют методы get() и set(). Их также можно вызывать непосредственно по имени.

В Kotlin массивы представлены не только классом Array. Есть специальные классы (и соответствующие им функции) для создания массивов, содержащих элементы примитивных типов – BooleanArray, ByteArray, ShortArray, IntArray, LongArray, CharArray, FloatArray, DoubleArray. Они несколько упрощают создание массивов. Обратим внимание, нет StringArray. Строки не примитивный тип.

fun main() {
    val a: ByteArray = byteArrayOf(true, false, false)
 
    for (i in a) println(i)
}

Для числовых типов также есть варианты беззнаковых массивов – UByteArray, UShortArray, UIntArray, ULongArray.

С помощью логических операторов in и !in можно проверить наличие определенных значений в массиве.

fun main() {
    val a: BooleanArray = booleanArrayOf(true, false, false)
    val b: IntArray = intArrayOf(5, 3, 1, 2)
 
    println(true in a) // true
    println(0 in b) // false
}

Матрицы

В Kotlin возможно создание двумерных массивов.

fun main() {
    val a: Array<IntArray> = Array(3) {IntArray(4) {0} }
 
    val n = a.size // количество строк
    val m = a[0].size // количество элементов в строке
 
    for (i in 0 until n) {
        for (j in 0 until m) {
            a[i][j] = (Math.random() * 10).toInt()
            print(" ${a[i][j]}")
        }
        println()
    }
}

Пример выполнения кода:

 0 1 0 1
 3 5 2 9
 4 7 9 9

Заполнять массив можно также с помощью функций:

fun main() {
    val a: Array<IntArray> = Array(2) {IntArray(4) {0} }
    a[0] = intArrayOf(1, 2, 3, 4)
    a[1] = intArrayOf(5, 6, 7, 8)
 
    for (i in a) {
        for (j in i) {
            print(" $j")
        }
        println()
    }
}