Шаг 119.
Основы Kotlin.
Списки и множества. Множества. Добавление элементов во множество

    На этом шаге мы рассмотрим различные способы выполнения этой операции.

    Чтобы добавить разнообразия, сгенерируем имена посетителей случайным образом, используя список имен и фамилий. Добавьте в Tavern.kt список фамилий и используйте forEach, чтобы получить 10 случайных комбинаций имен (из patronList) и фамилий. (Напомним, что для итераций можно использовать диапазоны.)

    Удалите два вызова forEachIndexed, приветствовавших посетителей и создававших заказы из меню. Вскоре мы заменим их итерациями по списку уникальных посетителей.

.   .   .   .
val patronList = mutableListOf("Eli", "Mordoc", "Sophie")
val lastName = listOf("Ironfoot", "Fernsworth", "Baggins")
val menuList = File("data/tavern-menu-items.txt")
        .readText()
        .split("\n")
.   .   .   .
fun main() {
    .    .   .   .
    (0..9).forEach {
        val first = patronList.shuffled().first()
        val last = lastName.shuffled().first()
        val name = "$first $last"
        println(name)
    }
}
.   .   .   .
Файл с проектом можно взять здесь.


Рис.1. Генерация 10 случайных посетителей (Tavern.kt)

    Запустите Tavern.kt. Вы увидите 10 случайных имен посетителей в выводе. Они не обязательно будут совпадать с приведенными ниже, но будут похожи - и среди них будут попадаться одинаковые сочетания имен и фамилий:

  The tavern master says: Eli's in the back playing cards.
  The tavern master says: Yea, they're seated by the stew kettle.
  Sophie Fernsworth
  Mordoc Baggins
  Eli Fernsworth
  Sophie Ironfoot
  Sophie Fernsworth
  Mordoc Baggins
  Sophie Baggins
  Eli Fernsworth
  Eli Baggins
  Mordoc Fernsworth


Рис.2. Результат работы приложения

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

    Чтобы удалить имена-дубликаты из списка, добавим каждое имя в множество. Любые повторяющиеся элементы будут отброшены, и останутся только уникальные значения.

    Объявите пустое изменяемое множество и добавьте туда случайно сгенерированные имена посетителей.

.   .   .   .
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")
.   .   .   .
fun main() {
    .    .   .   .
    (0..9).forEach {
        val first = patronList.shuffled().first()
        val last = lastName.shuffled().first()
        val name = "$first $last"
        uniquePatrons += name
    }
    println(uniquePatrons)
}
.   .   .   .
Файл с проектом можно взять здесь.


Рис.3. Уникальность через множество (Tavern.kt)

    Обратите внимание, что вы не можете рассчитывать на автоматическое определение типов для uniquePatrons, потому что объявили его как пустое множество. Необходимо указывать тип элементов, которое оно может содержать: mutableSetOf<String>. В этом случае вы используете оператор += для добавления name в uniquePatrons и выполняете итерации 10 раз.

    Запустите Tavern.kt снова. В множестве содержатся только уникальные значения, поэтому вы наверняка получите менее 10 имен посетителей.

  The tavern master says: Eli's in the back playing cards.
  The tavern master says: Yea, they're seated by the stew kettle.
  [Eli Fernsworth, Sophie Fernsworth, Eli Ironfoot, Mordoc Ironfoot, 
    Mordoc Fernsworth, Sophie Ironfoot]


Рис.4. Результат работы приложения

    Хотя MutableSet поддерживает добавление и удаление элементов, как и MutableList, он не поддерживает мутаторы с доступом по индексу. В таблице 1 перечислены некоторые самые часто применяемые мутаторы для MutableSet.

Таблица 1. Мутаторы изменяемых множеств
Функция Описание Примеры
add Добавляет элемент в множество mutableSetOf(1,2).add(3)
[1,2,3]
addAll Добавляет все элементы другой коллекции в множество mutableSetOf(1,2).addAll(listOf(1,5,6))
[1,2,5,6]
+= (оператор сложения с присваиванием) Добавляет элемент(ы) в множество mutableSetOf(1,2) += 3
[1,2,3]
-= (оператор вычитания с присваиванием) Удаляет элемент(ы) из множества mutableSetOf(1,2,3) -= 3
[1,2]
mutableSetOf(1,2,3) -= listOf(2,3)
[1]
remove Удаляет элемент из множества mutableSetOf(1,2,3).remove(1)
[2,3]
removeAll Удаляет из множества все элементы, перечисленные в другой коллекции mutableSetOf(1,2).removeAll(listOf(1,5,6))
[2]
clear Удаляет все элементы из множества mutableSetOf(1,2).clear()
[]

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




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