Spec-Zone.ru › Kotlin 1.9

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

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

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

Для получения значения из словаря необходимо предоставить его ключ в качестве аргумента функции 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–2023 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