На этом шаге мы рассмотрим различные способы выполнения этой операции.
Чтобы добавить разнообразия, сгенерируем имена посетителей случайным образом, используя список имен и фамилий. Добавьте в 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.
Функция | Описание | Примеры |
---|---|---|
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.