Словари в 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-версия курса с ответами к практическим работам