Spec-Zone.ru › Kotlin 1.7

Операции со словарями

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

Получение ключей и значений

Для получения значения из словаря необходимо указать его ключ в качестве аргумента функции get(). Также поддерживается сокращённая запись [key] . Если заданного ключа не найдено, возвращается null. Также существует функция getValue(), которая имеет немного другое поведение: она выбрасывает исключение, если ключ не найден в словаре. Кроме того, у вас есть ещё два варианта обработки отсутствия ключа:

  • getOrElse() работает аналогично спискам: значения для несуществующих ключей возвращаются из заданной лямбда-функции.

  • getOrDefault() возвращает заданное значение по умолчанию, если ключ не найден.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap.get("one"))
    println(numbersMap["one"])
    println(numbersMap.getOrDefault("four", 10))
    println(numbersMap["five"])               // null
    //numbersMap.getValue("six")      // exception!
//sampleEnd
}

Чтобы выполнить операции со всеми ключами или со всеми значениями словаря, их можно получить из свойств keys и values соответственно. keys — это множество всех ключей словаря, а values — коллекция всех значений словаря.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap.keys)
    println(numbersMap.values)
//sampleEnd
}

Фильтр

Вы можете фильтровать словари с помощью функции filter(), как и другие коллекции. При вызове filter() для словаря, передайте в него предикат с Pair в качестве аргумента. Это позволяет использовать как ключ, так и значение в предикате фильтра.

fun main() {
//sampleStart
    val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
    val filteredMap = numbersMap.filter { (key, value) -> key.endsWith("1") && value > 10}
    println(filteredMap)
//sampleEnd
}

Также существуют два специальных способа фильтрации словарей: по ключам и по значениям. Для каждого способа существует функция: filterKeys() и filterValues(). Обе возвращают новый словарь пар элементов, которые соответствуют заданному предикату. Предикат для filterKeys() проверяет только ключи элементов, а предикат для filterValues() проверяет только значения.

fun main() {
//sampleStart
    val numbersMap = mapOf("key1" to 1, "key2" to 2, "key3" to 3, "key11" to 11)
    val filteredKeysMap = numbersMap.filterKeys { it.endsWith("1") }
    val filteredValuesMap = numbersMap.filterValues { it < 10 }

    println(filteredKeysMap)
    println(filteredValuesMap)
//sampleEnd
}

Операторы сложения и вычитания

Из-за доступа к элементам по ключу, операторы plus (+) и minus (-) работают для словарей по-другому, чем для других коллекций. plus возвращает Map, содержащий элементы обоих операндов: Map слева и Pair или другой Map справа. Когда операнд справа содержит пары с ключами, присутствующими в Map слева, результирующий словарь содержит пары из правой части.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap + Pair("four", 4))
    println(numbersMap + Pair("one", 10))
    println(numbersMap + mapOf("five" to 5, "one" to 11))
//sampleEnd
}

minus создаёт Map из пар Map слева, за исключением пар с ключами из операнда справа. Таким образом, операнд справа может быть как одним ключом, так и коллекцией ключей: списком, множеством и так далее.

fun main() {
//sampleStart
    val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3)
    println(numbersMap - "one")
    println(numbersMap - listOf("two", "four"))
//sampleEnd
}

Подробную информацию об использовании операторов plusAssign (+=) и minusAssign (-=) для изменяемых словарей см. ниже в разделе Операции записи для словарей.

Операции записи для словарей

Изменяемые словари предлагают специализированные операции записи. Эти операции позволяют изменять содержимое словаря с помощью доступа к значениям по ключу.

Существуют определённые правила, определяющие операции записи для словарей:

  • Значения могут быть обновлены. В свою очередь, ключи никогда не меняются: после добавления пары её ключ остаётся постоянным.

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

Ниже описаны функции стандартной библиотеки для операций записи, доступных для изменяемых словарей.

Добавление и обновление пар

Для добавления новой пары ключ-значение в изменяемый словарь используйте put(). При добавлении новой пары в LinkedHashMap (стандартная реализация словаря), она добавляется в конец при итерации по словарю. В отсортированных словарях позиции новых элементов определяются порядком их ключей.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2)
    numbersMap.put("three", 3)
    println(numbersMap)
//sampleEnd
}

Для добавления нескольких пар одновременно используйте putAll(). Его аргументом может быть Map или группа Pair: Iterable, Sequence, или Array.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
    numbersMap.putAll(setOf("four" to 4, "five" to 5))
    println(numbersMap)
//sampleEnd
}

И put() , и putAll() перезаписывают значения, если заданные ключи уже существуют в словаре. Таким образом, их можно использовать для обновления значений пар.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2)
    val previousValue = numbersMap.put("one", 11)
    println("value associated with 'one', before: $previousValue, after: ${numbersMap["one"]}")
    println(numbersMap)
//sampleEnd
}

Также можно добавлять новые пары в словари с использованием сокращённой операторной формы. Существует два способа:

  • plusAssign (+=) оператор.

  • Оператор [] — псевдоним для оператора set().

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2)
    numbersMap["three"] = 3     // calls numbersMap.put("three", 3)
    numbersMap += mapOf("four" to 4, "five" to 5)
    println(numbersMap)
//sampleEnd
}

При вызове с ключом, уже присутствующим в словаре, операторы перезаписывают значения соответствующих пар.

Удаление пар

Для удаления пары из изменяемого словаря используйте функцию remove(). При вызове remove() можно передать либо ключ, либо целую пару ключ-значение. Если вы укажете и ключ, и значение, то элемент с данным ключом будет удалён только если его значение совпадает со вторым аргументом.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
    numbersMap.remove("one")
    println(numbersMap)
    numbersMap.remove("three", 4)            //doesn't remove anything
    println(numbersMap)
//sampleEnd
}

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

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3, "threeAgain" to 3)
    numbersMap.keys.remove("one")
    println(numbersMap)
    numbersMap.values.remove(3)
    println(numbersMap)
//sampleEnd
}

Оператор minusAssign (-=) также доступен для изменяемых словарей.

fun main() {
//sampleStart
    val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3)
    numbersMap -= "two"
    println(numbersMap)
    numbersMap -= "five"             //doesn't remove anything
    println(numbersMap)
//sampleEnd
}
Последнее изменение: 11 февраля 2021
Операции со множествами Функции области видимости

© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/map-operations.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API