Списки в Kotlin

Под списками в программировании понимают составной тип данных, элементы которого упорядочены как в случае массивов. Однако списки могут содержать элементы разных типов, количество элементов в них можно менять, то есть удалять и добавлять.

Списки являются разновидностью коллекций – особой группы типов данных, или классов. Коллекции разных типов имеют во многом похожие функции-методы. Разные коллекции можно передавать в одни и те же функции. Коллекции связаны между собой наследованием и общими интерфейсами.

С другой стороны, в Kotlin списки (как и другие типы коллекций) делятся на неизменяемые и изменяемые. В неизменяемых нельзя менять количество элементов и изменять значение элементов. Это сделано с целью защиты данных. Если программист не планирует изменение списка при последующей разработке программы или ее выполнении, то, делая список неизменяемым, он его защищает от случайных изменений. Ведь val по отношению к списку не делает его неизменяемым. Как и в случае массивов val-список можно менять, нельзя только присвоить другой список.

В Kotlin неизменяемый список обычно создается вызовом функции listOf(), которой передается список элементов. Также можно использовать конструктор класса List (по аналогии с массивами).

fun main() {
    val a = listOf("one", "two", 3)
    val b = listOf(1.2, 4.5, 3.2, 1.8)
    val c: List<Double>
 
    c = b + listOf(4.3, 2.5)
 
    println(a)
    println(b)
    println(c)
}

Создание неизменяемых списков в Kotlin

Переменные неизменяемых списков имеют типы List<Any>, List<Double> и т. д. Any (любой) – значит, что список имеет элементы разного типа. На самом деле такие списки используются редко.

Получить отдельный элемент из списка можно по индексу, также как в случае с массивами. Например, выражение println(b[0]) выведет на экран первый элемент списка b.

Попытка присвоить новое значение какому-нибудь элементу неизменяемого списка вернет ошибку. Например, если b – это переменная типа List<Double>, то выражение b[0] = 1.1 недопустимо.

Другое дело – изменяемые списки. Такие списки в Kotlin относятся к типу MutableList. Слово "mutable" переводится как изменяемый.

fun main() {
    val b = mutableListOf(1.2, 4.5, 3.2, 1.8)
 
    println(b[0])
    b[0] = 10.0
    println(b[0])
 
    for (i in b.indices) {
        b[i] += 0.3
    }
 
    println(b)
}

Изменяемый список в Kotlin

Выражение b.indices возвращает диапазон от 0 до индекса последнего элемента массива. Так в примере выше это будет диапазон 0..3.

Особенностью изменяемых списков является не только изменение значений элементов. Это можно делать и с массивами. В списки можно добавлять элементы, удалять их оттуда. Для этого используются специальные методы.

В Kotlin с помощью различных вариаций методов add() и addAll() в список добавляется элемент или другой список.

fun main() {
    val b = mutableListOf(1.2, 4.5, 3.2, 1.8)
    println(b.size)
 
    b.add(10.0)
    b.add(0, 12.5)
    b.addAll(b.size / 2, listOf(-3.4, -8.9) )
 
    println(b.size)
    for (i in b) {
        print("$i ")
    }
}

Добавление элементов в список

Если в функцию add() передается только один аргумент, то он расценивается как значение и добавляется в конец списка. Если передается два аргумента, то первый считается индексом, а второй – значением, которое надо вставить в указанное место списка.

Для удаления элементов из списка используются методы removeAt(), который удаляет элемент по индексу, и remove(), удаляющий из списка указанное значение, а также ряд других.

fun main() {
    val b = mutableListOf(1.2, 4.5, 3.2, 1.8, 3.2)
    b.removeAt(0)
    b.remove(3.2)
    println(b) // вывод: [4.5, 1.8, 3.2]
}

Если в списке есть повторы значения, то remove() удаляет только одно из них.

Практическая работа:

  1. Заполните список числами. Выведите на экран. Примените к списку функцию-метод shuffle(). Снова выведите список на экран. Что делает метод shuffle()?

  2. Заполните список случайными числами, отсортируйте его с помощью метода sort(), удалите из списка минимальное и максимальное значения.