- Map kotlin change value
- Обращение к элементам Map
- MutableMap
- Map: специфичные операции
- Получение ключей и значений
- Фильтрация
- Операторы plus и minus
- Операции записи
- Добавление и обновление записи
- Удаление записей
- How to add or update an entry of the HashMap in Kotlin
- Overview
- Syntax
- Return value
- Code
- Code explanation
Map kotlin change value
Коллекция Map представляет коллекцию объектов, где каждый элемент имеет ключ и сопоставляемое с ним значение. При этом все ключи в коллекции являются уникальными. В отличие от List и Set интерфейс Map не расширяет интерфейс Collection.
Map представляет неизменяемую коллекцию, для создания которой применяется метод mapOf() .
val people = mapOf(1 to "Tom", 5 to "Sam", 8 to "Bob")
Функция mapOf принимает набор элементов, каждый из которых с помощью оператора to сопоставляет ключ со значением, например, 1 to «Tom» (с условным идентификатором пользователя сопоставляется его имя). В данном случае переменная people представляет объект Map , где первый тип — Int представляет тип ключей (идентификатор пользователя), а второй тип — String представляет тип значений.
Для перебора Map можно использовать цикл for, при этом каждый элемент будет представлять объект Map.Entry . Через его свойство key можно получить ключ, а с помощью value — значение:
val people = mapOf(1 to «Tom», 5 to «Sam», 8 to «Bob») for(person in people) < println("$- $") > println(people) //
Обращение к элементам Map
Для получения элементов по ключу может применяться метод get() , в который передается ключ элемента:
val dictionary = mapOf("red" to "красный", "blue" to "синий", "green" to "зеленый") val blue = dictionary.get("blue") println(blue) // синий
В данном случае переменная dictionary представляет объект Map , где ключи представляют строки, а значения — то же строки (условный перевод слова). Для получения значения по ключу «blue», применяется выражение dictionary.get(«blue»)
Также можно сократить получение элемента с помощью квадратных скобок:
val dictionary = mapOf("red" to "красный", "blue" to "синий", "green" to "зеленый") val blue = dictionary["blue"] println(blue) // синий
Если в Map нет элемента с указанным ключом, то возвращается null:
val yellow = dictionary.get("yellow") // либо так // val yellow = dictionary["yellow"] println(yellow) // null
Такое поведение не всегда может быть предпочтительно. И в этом случае можно использовать пару других методов для получения элементов. Так, метод getOrDefault() позволяет задать значение по умолчанию, которое будет возврашаться, если по указанному ключу нет элементов:
val dictionary = mapOf("red" to "красный", "blue" to "синий", "green" to "зеленый") val yellow = dictionary.getOrDefault("yellow", "Undefined") println(yellow) // Undefined val blue = dictionary.getOrDefault("blue", "Undefined") println(blue) // синий
Еще один метод — getOrElse() в качестве второго параметра принимает функцию, которая задает значение на случай, если по указанному ключу нет элементов:
val dictionary = mapOf("red" to "красный", "blue" to "синий", "green" to "зеленый") val yellow = dictionary.getOrElse("yellow") println(yellow) // Not found val blue = dictionary.getOrElse("blue") println(blue) // синий
Кроме получения отдельных элементов Map позволяет получить отдельно ключи и значения с помощью свойств :
val dictionary = mapOf("red" to "красный", "blue" to "синий", "green" to "зеленый") println(dictionary.values) // [красный, синий, зеленый] println(dictionary.keys) // [red, blue, green]
Также с помощью методов containsKey() и containsValue() можно проверить наличие в Map определенного ключа и значения соответственно:
val dictionary = mapOf("red" to "красный", "blue" to "синий", "green" to "зеленый") println(dictionary.containsKey("blue")) // true println(dictionary.containsKey("yellow")) // false println(dictionary.containsValue("желтый")) // false println(dictionary.containsValue("зеленый")) // true
MutableMap
Изменяемые коллекции представлены интерфейсом MutableMap , который расширяет интерфейс Map. Для создания объекта MutableMap применяется функция mutableMapOf() .
val people = mutableMapOf(220 to «Tom», 225 to «Sam», 228 to «Bob») // MutableMap
Интерфейс MutableMap реализуется рядом коллекций:
- HashMap : простейшая реализация интерфейса MutableMap, не гарантирует порядок элементов в коллекции. Создается функцией hashMapOf()
- LinkedHashMap : представляет комбинацию HashMap и связанного списка, создается функцией linkedMapOf()
val linkedMap = linkedMapOf(220 to «Tom», 225 to «Sam», 228 to «Bob») // объект типа LinkedHashMap val hashMap = hashMapOf(220 to «Tom», 225 to «Sam», 228 to «Bob») // объект типа HashMap
Для изменения Map можно применять ряд методов:
- put(key: K, value: V) : добавляет элемент с ключом key и значением value
- putAll() : добавляет набор объектов типа Pair . В качестве такого набора могут выступать объекты Iterable, Sequence и Array
- set(key: K, value: V) : устанавливает для элемента с ключом key значение value
- remove(key: K): V? : удаляет элемент с ключом key. Если удаление успешно произведено, то возвращается значение удаленного элемента, иначе возвращается null. Дополнительная версия метода
remove(key: K, value: V): Boolean
val people = mutableMapOf(1 to «Tom», 2 to «Sam», 3 to «Bob») // добавляем один элемент с ключом 229 и значением Mike people.put(229, «Mike») println(people) // // добавляем другую коллекцию val employees = mapOf(301 to «Kate», 302 to «Bill») people.putAll(employees) println(people) //
val people = mutableMapOf(1 to «Tom», 2 to «Sam», 3 to «Bob») // изменяем элемент с ключом 1 people.set(1, «Tomas») println(people) //
Вместо метода set для установки значения могут применяться квадратные скобки, в которые передается ключ элемента:
val people = mutableMapOf(1 to «Tom», 2 to «Sam», 3 to «Bob») // изменяем элемент с ключом 1 people[1] = «Tomas» println(people) // // изменяем элемент с ключом 5 people[5] = «Adam» println(people) //
Причем если с указанным ключом нет элемента, то он добавляется, как в примере выше в случае с ключом 5.
val people = mutableMapOf(1 to «Tom», 2 to «Sam», 3 to «Bob») // удаляем элемент с ключом 1 people.remove(1) println(people) // // удаляем элемент с ключом 3, если его значение — «Alice» people.remove(3, «Alice») println(people) // // удаляем элемент с ключом 3, если его значение — «Bob» people.remove(3, «Bob») println(people) //
Map: специфичные операции
В Map типы ключей и значений определяются пользователем. При этом благодаря доступу к значениям по их ключу открываются различные возможности для обработки записей: от получения значения по ключу, до фильтрации ключей и значений по отдельности. В этом разделе находится описание функций из стандартной библиотеки для обработки ассоциативных списков.
Получение ключей и значений
Для того чтобы получить значение из Map , вы должны передать его ключ в качестве аргумента функции get() . Также поддерживается сокращённый синтаксис — Map kotlin change value . Если такой ключ не найден, то вернётся null . Помимо этого существует функция getValue() , которая в случае отсутствия ключа бросит исключение. Также есть еще две функции для решения проблемы отсутствия ключа:
- getOrElse() — работает так же, как и для списков: если ключ не найден, то вернётся результат выполнения лямбды.
- getOrDefault() — если ключ не найден, то вернёт заданное значение по умолчанию.
Если для выполнения операций вам требуются все ключи или все значения из Map , то воспользуйтесь свойствами keys и values . keys — это набор ( Set ) всех ключей, а values — коллекция всех значений.
Фильтрация
Вы можете фильтровать ассоциативный список с помощью функции filter() как и другие коллекции. Для этого передайте filter() предикат с Pair в качестве аргумента, что позволит использовать и ключ, и значение в предикате.
fun main() < 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) // >
Помимо этого существует две функции фильтрации, специфичные именно для ассоциативного списка: filterKeys() для фильтра по ключам и filterValues() для фильтра по значениям. Обе возвращают новый ассоциативный список, в котором все записи соответствуют заданному предикату. Предикат функции filterKeys() проверяет только ключи элементов, а предикат функции filterValues() проверяет только значения.
fun main() < 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) // >
Операторы plus и minus
Из-за наличия доступа к элементам по их ключам операторы plus ( + ) и minus ( — ) работают с ассоциативными списками иначе, чем с другими коллекциями. Оператор plus возвращает Map , которая содержит в себе элементы обоих операндов: первым операндом должен быть Map , а вторым может быть Pair или другая Map . Если второй операнд содержит в себе записи с ключами, которые есть в первом операнде, то в результирующую Map попадут записи из второго операнда.
fun main() < 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)) // >
Оператор minus создаёт Map на основе первого операнда, исключая те записи, ключи которых есть во втором операнде. Таким образом, второй операнд может быть либо одним ключом, либо коллекцией ключей: списком, множеством и так далее.
fun main() < val numbersMap = mapOf("one" to 1, "two" to 2, "three" to 3) println(numbersMap - "one") // println(numbersMap - listOf("two", "four")) // >
Подробнее об использовании операторов plusAssign ( += ) и minusAssign ( -= ) с изменяемыми ассоциативными списками см. ниже Операции записи.
Операции записи
Изменяемые ассоциативные списки предлагают специфичные для них операции записи. Такие операции позволяют изменять содержимое ассоциативного списка, используя доступ к значениям по ключу.
Все операции записи придерживаются следующих правил:
- Значения можно обновлять. В свою очередь, ключи никогда не меняются: как только вы добавили запись, её ключ остаётся неизменным.
- Для каждого ключа всегда есть одно значение, связанное с ним. Вы можете добавлять и удалять записи целиком.
Ниже описаны функции для операций записи из стандартной библиотеки, доступные для использования с изменяемыми ассоциативными списками.
Добавление и обновление записи
Для добавления в изменяемый ассоциативный список новой пары «ключ-значение» используйте функцию put() . Когда новая запись помещается в LinkedHashMap (реализация Map по умолчанию), она добавляется в неё таким образом, что при итерации Map она отображается последней. В отсортированных ассоциативных списках положение новых элементов определяется порядком их ключей.
Для добавления нескольких записей за раз, используйте функцию putAll() . В качестве аргумента она принимает Map или группу из Pair : Iterable , Sequence , или Array .
И put() , и putAll() перезаписывают значения, если указанные ключи уже существуют в Map . Поэтому вы можете использовать их, чтобы обновить значения записей.
fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2) val previousValue = numbersMap.put("one", 11) println("value associated with 'one', before: $previousValue, after: $") // 11 println(numbersMap) // >
Помимо этого, вы можете использовать упрощённый вариант для добавления записей в ассоциативный список. Есть два способа:
Если вызвать эти операторы с ключом, который уже существует в ассоциативном списке, то его значение будет перезаписано.
Удаление записей
Для удаления записи из изменяемой Map , используйте функцию remove() . При вызове remove() , вы можете передать ей либо только ключ, либо и ключ, и его значение. При этом, если вы передадите и ключ, и значение, то элемент с этим ключом будет удалён только в том случае, если его значение совпадает с переданным значением.
fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3) numbersMap.remove("one") println(numbersMap) // numbersMap.remove("three", 4) // ничего не удаляет println(numbersMap) // >
Также вы можете удалять записи из ассоциативного списка используя свойства keys или values : просто вызовите функцию remove() для них. При вызове remove() с values , будет удалена только первая запись с таким значением.
fun main() < 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) // >
Оператор minusAssign ( -= ) для изменяемых Map тоже доступен.
fun main() < val numbersMap = mutableMapOf("one" to 1, "two" to 2, "three" to 3) numbersMap -= "two" println(numbersMap) // numbersMap -= "five" // ничего не удаляет println(numbersMap) // >
How to add or update an entry of the HashMap in Kotlin
Many candidates are rejected or down-leveled in technical interviews due to poor performance in behavioral or cultural fit interviews. Ace your interviews with this free course, where you will practice confidently tackling behavioral interview questions.
Overview
The set method adds or updates an entry in the HashMap .
Syntax
operator fun MutableMap.set(key: K, value: V)
Argument: The key and value to be added or updated.
Return value
This method doesn’t return any value.
Code
The code below demonstrates how to add or update an entry from the HashMap .
fun main()//create a new LinkedHashMap which can have String type as key, and int type as valuevar map : HashMap = HashMap ()// add two entriesmap.put("one", 1)map.put("two", 2)map.put("three", 3)println("The map is : $map")// updating value of an entryprintln("\nUpdating the value from 1 to 10 for the entry with key-one")map.set("one", 10);println("The map is : $map")// adding a new entryprintln("\nAdding a new entry four-4")map.set("four", 4);println("The map is : $map")>Code explanation
Line 3: We create a new HashMap object named map .
Lines 5–7: We add three entries to the map , using the put method.
Line 12: We use the set method with ( one , 10 ) as arguments. This method checks for the entry with the key- one . In our map, there is one entry with the key — one . Therefore, the value of the entry is updated to 10. Now the map is .
Line 16: We use the set method with ( four , 4 ) as arguments. This method checks for the entry with the key-four. In our map, there is no entry with a key — four . Therefore a new entry < four - 4 >will be added to the map . Now the map is .