Шаг 127.
Основы Kotlin.
Ассоциативные массивы. Создание ассоциативного массива
На этом шаге мы рассмотрим особенности создания такого массива.
Подобно спискам и множествам, ассоциативные массивы создаются с помощью функций: mapOf() или mutableMapOf(). В Tavern.kt создайте ассоциативный массив для
представления количества золота у каждого посетителя в кошельке (мы объясним синтаксис аргумента ниже).
. . . .
val patronList = mutablelistOf("Eli", "Mordoc", "Sophie")
val lastName = listOf("Ironfoot", "Fernsworth", "Baggins")
val uniquePatrons = mutableSetOf<String>()
val menuList = File("data/tavern-menu-items.txt")
.readText()
.split("\n")
val patronGold = mapOf("Eli" to 10.5, "Mordoc" to 8.0, "Sophie" to 5.5)
fun main() {
. . . .
var orderCount = 0
while (orderCount <= 9) {
placeOrder(uniquePatrons.shuffled().first(),
menuList.shuffled().first())
orderCount++
}
println(patronGold)
}
. . . .
Файл с проектом можно взять
здесь.

Рис.1. Создание доступного только для чтения ассоциативного массива (Tavern.kt)
Ключи ассоциативного массива должны быть одного типа и значения должны быть одного типа, но сами ключи и значения могут быть разных типов. Здесь создается ассоциативный массив
со строковыми ключами и дробными значениями. Мы положились на автоматическое определение типов, но при желании явно показать типы ключей и значений мы могли бы объявить
ассоциативный массив так:
val patronGold: Map<String, Double>.
Запустите Tavern.kt, чтобы увидеть получившийся массив.
Обратите внимание, что при выводе ассоциативный массив заключается в фигурные скобки, тогда как списки и множества - в квадратные.
Eli Ironfoot buys a shirley temple (elixir) for 4.12.
Eli Ironfoot says: Thanks for the shirley temple.
{Eli=10.5, Mordoc=8.0, Sophie=5.5}

Рис.2. Получившийся массив
Вы использовали to для определения каждого элемента (ключа и значения) в ассоциативном массиве:
mapOf("Eli" to 10.5, "Mordoc" to 8.0, "Sophie" to 5.5)
Слово
to может выглядеть как ключевое слово, но по факту - это особая разновидность функций, которые можно вызывать, отбросив точку и скобки вокруг аргументов. Вы узнаете
больше об этом позже. Функция
to() преобразует операнды слева и справа в пару (
Pair) - тип, представляющий группу из двух элементов.
Ассоциативные массивы строятся с использованием пар "ключ-значение". Также существует другой способ определения элементов ассоциативного массива, как показано ниже.
(Попробуйте в REPL.)
val patronGold = mapOf(Pair("Eli", 10.75),
Pair("Mordoc", 8.00),
Pair("Sophie", 5.50))

Рис.3. Объявление ассоциативного массива с использованием типа Pair (REPL)
Однако синтаксис создания ассоциативного массива с функцией to() выглядит аккуратнее.
Мы уже сказали, что ключи в ассоциативном массиве должны быть уникальными. Но что случится, если попробовать повторно добавить элемент с тем же ключом? Добавьте пару с ключом
"Sophie" в REPL.
val patronGold = mutableMapOf("Eli" to 5.0, "Sophie" to 1.0)
patronGold += "Sophie" to 6.0
println(patronGold)
{Eli=5.0, Sophie=6.0}

Рис.4. Добавление дубликата ключа (REPL)
Вы использовали оператор сложения с присваиванием (+=), чтобы добавить пару с повторяющимся ключом в ассоциативный массив. Так как ключ "Sophie" уже есть в массиве,
существующая пара была затерта новой. Аналогичное поведение можно наблюдать при включении повторяющихся значений при инициализации массива:
println(mapOf("Eli" to 10.75,
"Mordoc" to 8.25,
"Sophie" to 5.50,
"Sophie" to 6.25))
{Eli=10.75, Mordoc=8.25, Sophie=6.25}

Рис.5. Включение повторяющихся значений при инициализации массива (REPL)
На следующем шаге мы рассмотрим доступ к значениям в ассоциативном массиве.
Предыдущий шаг
Содержание
Следующий шаг