На этом шаге мы рассмотрим особенности создания такого массива.
Подобно спискам и множествам, ассоциативные массивы создаются с помощью функций: 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)
Ассоциативные массивы строятся с использованием пар "ключ-значение". Также существует другой способ определения элементов ассоциативного массива, как показано ниже. (Попробуйте в 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)
На следующем шаге мы рассмотрим доступ к значениям в ассоциативном массиве.