Шаг 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)

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




Предыдущий шаг Содержание Следующий шаг