Статистика контактов
Часть раздела Логика и управление потоком путешествия по Kotlin на Coddy. Урок 25 из 63.
Задание
СложноДополните contactBook параметрами commands: List<String>, names: List<String>, phones: List<String>. Создайте хранящуюся в памяти книгу контактов, которая начинается пустой при каждом вызове функции. Три списка имеют одинаковую длину, не более 100. В каждом индексе список commands выбирает операцию, а списки names и phones предоставляют её аргументы. Имена — непустые слова в нижнем регистре ASCII; телефоны — непустые строки из цифр, и они должны оставаться строками, чтобы сохранять начальные нули. Каждая команда формирует один ответ в возвращаемом списке. Сохраняйте всё, что было написано на предыдущих шагах, включая все предыдущие команды и ответы. Поддержите PUT: сохраните или замените телефон для указанного имени, затем верните ответ saved. Добавьте FIND: верните сохранённый телефон для указанного имени или missing. Его аргумент телефона игнорируется. Добавьте REMOVE: удалите указанное имя и верните removed, если оно существовало, или missing в противном случае. Его аргумент телефона игнорируется. Добавьте LIST: верните отсортированный список сохранённых имён в стандартном формате Kotlin со скобками, например [ada, bo], или [], если список пуст. Оба значения аргументов игнорируются. Используйте contacts.keys.sorted().toString(), чтобы создать эту единственную строку ответа. Добавьте COUNT: верните contacts=N;phones=P, заменив N количеством сохранённых имён, а P — количеством различных сохранённых строк телефонов. Оба аргумента игнорируются. Два имени могут иметь один и тот же телефон. Входные данные содержат только команды, поддерживаемые на этом шаге. Игнорируемые строки аргументов могут содержать любой непустой текст.
Если выше не указаны более строгие ограничения, коллекции содержат не более 100 элементов на каждом уровне, а целочисленные аргументы и целочисленные значения коллекций находятся в диапазоне от -1000 до 1000. Текст, предоставленный для разбора, может содержать недопустимые представления или представления, выходящие за допустимый диапазон, как описано.
Верните значение типа List<String>. Сохраните предоставленный код ввода/вывода. Он считывает скалярные аргументы по одному в строке; список начинается с его размера, за которым следуют его элементы, а отображение начинается с количества записей, за которым следуют каждый ключ и значение. Для вложенных списков для каждой строки повторяется формат «размер и элементы». Предоставленный main выводит возвращаемое значение, за которым следует один перевод строки. Списки используют стандартный формат Kotlin со скобками; не выводите дополнительные метки.
Попробуйте сами
fun contactBook(commands: List<String>, names: List<String>, phones: List<String>): List<String> {
val contacts = mutableMapOf<String, String>()
val replies = mutableListOf<String>()
for (i in commands.indices) {
val name = names[i]
when (commands[i]) {
"PUT" -> {
contacts[name] = phones[i]
replies.add("saved")
}
"FIND" -> replies.add(contacts[name] ?: "missing")
"REMOVE" -> {
if (contacts.containsKey(name)) {
contacts.remove(name)
replies.add("removed")
} else replies.add("missing")
}
"LIST" -> replies.add(contacts.keys.sorted().toString())
}
}
return replies
}
fun main() {
val commandsCount = readln().toInt()
val commands = mutableListOf<String>()
for (i0 in 0 until commandsCount) {
val commandsItem = readLine().orEmpty()
commands.add(commandsItem)
}
val namesCount = readln().toInt()
val names = mutableListOf<String>()
for (i0 in 0 until namesCount) {
val namesItem = readLine().orEmpty()
names.add(namesItem)
}
val phonesCount = readln().toInt()
val phones = mutableListOf<String>()
for (i0 in 0 until phonesCount) {
val phonesItem = readLine().orEmpty()
phones.add(phonesItem)
}
println(contactBook(commands, names, phones))
}Все уроки раздела Логика и управление потоком
1Карты, часть 1
Создание картБезопасный доступ к картамОбновление картПроверка ключейПовторение — складской учёт4Вложенные коллекции
Списки списковОбход строкСводки по строкамСведение вложенных списковПовторение — ряды мест7Конвейеры коллекций
Преобразование с помощью MapФильтрация значенийПроверка правил коллекцийНакопление с помощью FoldПовторение — одобренные итоги2Карты. Часть 2
Перебор записей картыКлючи и значенияКарты частотВложенные картыПовторение — отчёт о частотах5Проект — Книга контактов
Сохранение контактовПоиск контактов3Множества и принадлежность
Создание множествОбновление множествОперации над множествамиПроверка подмножествПовторение — гости мероприятия6Значения функций
Написание лямбдТипы функцийПередача функцийЗахваченные переменныеПовторение — настраиваемый счёт9Расширенный контроль потока выполнения
Защитные условияПрерывание именованных цикловПродолжение именованных цикловРекурсивные функцииПовторение — первая допустимая строкаПотренируйтесь самостоятельно: Песочница Kotlin