Словари в Kotlin

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

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

Также как и в случае со списками в языке программирования Kotlin словари делятся на изменяемые и неизменяемые. Первые имеют тип данных Map, вторые – MutableMap. Соответствующие им встроенные в Kotlin функции для создания словарей – mapOf() и mutableMapOf().

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

fun main() {
    val a = mapOf(1 to "one", 2 to "two", 3 to "three")
    val b: Map<String, Int>
 
    b = mapOf("apple" to 10, "banana" to 5)
 
    for (i in a)
        println(i)
 
    println(b)
}

При определении словаря с помощью функции mapOf() пары ключ-значение передаются через слово to. Первым идет ключ. Чтобы извлечь значение по ключу, как и в случае массивов и списков можно использовать квадратные скобки. Однако вместо индекса в них записывается ключ.

fun main() {
    val a = mapOf(1 to "one", 2 to "two", 3 to "three")
    val b = mapOf("apple" to 10, "banana" to 5)
 
    println(a[1]) // вывод: one
    println(b["banana"]) // вывод: 5
}

С помощью свойств keys, values и entries получают коллекции соответственно ключей, значений и записей.

fun main() {
    val num = mapOf(1 to "one", 2 to "two", 3 to "three")
    val k = num.keys
    val v = num.values
    val e = num.entries
 
    println(k) 
    println(v)
    println(e)
 
    for ((i, j) in e)
        println("The $i is $j!")
}

Обратим внимание на выражение (i, j) in e. Каждый элемент множества e состоит из двух "подэлементов". Первый играл в словаре роль ключа, второй – значения. Когда такой "двойной" элемент присваивается сразу двум переменным (в данном случае i и j), то происходит "распаковка", то есть первый подэлемент присваивается первой переменной, второй – второй.

Проверить вхождение определенных ключей и значений в словарь можно с помощью функций containsKey() и containsValue().

fun main() {
    val num = mapOf(1 to "one", 2 to "two", 3 to "three")
    println(num.containsKey(4)) // false
    println(num.containsKey(2)) // true
    println(num.containsValue("five")) // false
    println(num.containsValue("one")) // true
}

С другой стороны, выражение ключ in словарь уже проверяет на вхождение ключа в словарь.

fun main() {
    val num = mapOf(1 to "one", 2 to "two", 3 to "three")
 
    if (1 in num)
        println("Yes")
    else
        println("No")
 
    for (i in num)
        println(i)
}

При этом подобное выражение в заголовке for извлекает вовсе не ключ, а запись целиком, с ключом и значением.

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

fun main() {
    val num = mutableMapOf(1 to "one", 2 to "two", 3 to "three")
 
    num[1] = "first"
    num[4] = "four"
    num[5] = "five"
    num.remove(2)
 
    println(num)
}

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

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

Пользователь вводит строки. Каждая строка состоит из двух слов, разделенных пробелом. Программа должна добавлять эти пары в словарь. Первое слово пары – это ключ, второе – значение. Для разделения слов одной строки используйте функцию-метод split(), в качестве аргумента передайте ей строку, содержащую один пробел – " ".

PDF-версия курса с ответами к практическим работам


Kotlin с нуля. Курс для начинающих




Все разделы сайта