Повторение — очередь с приоритетом
Часть раздела Объектно-ориентированное программирование путешествия по Kotlin на Coddy. Урок 41 из 57.
Задание
СреднеСоздайте приоритетную очередь, работающую с любым типом, поддерживающим приоритет. Prioritized (с priority), а также классы данных Job и Ticket предоставлены.
TaskQueue<T : Prioritized>имеет методыpush(item),pop()иpeek(), которые удаляют или возвращают элемент с наивысшим приоритетом (при одинаковых приоритетах — тот, который был добавлен первым) либоnull, свойствоsize, методitems()(доступный только для чтения снимок в порядке извлечения) и методdrain(n), который извлекает не болееnэлементов и возвращает их какList<T>.- Обобщённая функция
countUrgent(queue, min)принимает очередь любого типа, поддерживающего приоритет, и возвращает количество её элементов, приоритет которых не меньше указанного.
Предоставленный код считывает команды job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (для билетов) или sizes, выводит каждый ответ и в конце urgent: с количеством срочных заданий и билетов, которые всё ещё находятся в очереди.
Ваш код должен находиться в файлах TaskQueue.kt, Prioritized.kt, Job.kt и Ticket.kt. В Main.kt содержится предоставленный код ввода/вывода, и его нельзя изменять.
Попробуйте сами
fun main() {
// Предоставленный код ввода/вывода: оставьте его как есть
val input = generateSequence(::readLine).toList()
val jobs = TaskQueue<Job>()
val tickets = TaskQueue<Ticket>()
for (cmd in input) {
val p = cmd.split(" ")
when (p[0]) {
"job" -> jobs.push(Job(p[1], p[2].toInt()))
"ticket" -> tickets.push(Ticket(p[1].toInt(), p[2].toInt(), p[3]))
"pop" -> println("popped " + (if (p[1] == "jobs") jobs.pop() else tickets.pop()))
"peek" -> println("next " + (if (p[1] == "jobs") jobs.peek() else tickets.peek()))
"drain" -> println("drained " + tickets.drain(p[1].toInt()).map { it.customer })
else -> println("jobs ${jobs.size}, tickets ${tickets.size}")
}
}
println("urgent: ${countUrgent(jobs, 4) + countUrgent(tickets, 4)}")
}
Все уроки раздела Объектно-ориентированное программирование
1Классы и объекты
Работа с файламиОпределение классовПервичные конструкторыБлоки init и валидацияВторичные конструкторыПовторение — читательский билет4Наследование
Открытые классы и подклассыПереопределение членовsuper и конструкторыАбстрактные классыПовторение — каталог сотрудников7Специальные классы
Классы данныхКлассы перечисленийЗапечатанные иерархииequals, hashCode, toStringПовторение — трекер заказов10Паттерны проектирования. Часть 2
Делегирование с помощью byПаттерн декораторПаттерн строительПаттерн состояние2Свойства и инкапсуляция
Пользовательские аксессорыМодификаторы видимостиПриватные сеттерыlazy и lateinitПовторение — банковский счёт5Интерфейсы
Объявление интерфейсовМетоды по умолчаниюМножественные интерфейсыИнтерфейсы как типыПовторение — способы оплаты8Обобщения
Обобщённые функцииОбобщённые классыОграничения типовВариативность с in и outПовторение — очередь с приоритетом11Проект: Управление библиотекой
Книги и читателиВыдача книг3Объекты и компаньоны
Объявления объектовОбъекты-компаньоныКонстанты с constОбъектные выраженияПовторение — билетная касса6Полиморфизм
Динамическая диспетчеризацияПроверка типов и умные приведения типовwhen с типамиФункции-расширенияПовторение — смотритель зоопарка9Паттерны проектирования. Часть 1
Паттерн «Одиночка»Фабричный паттернПаттерн «Наблюдатель»Паттерн «Стратегия»Потренируйтесь самостоятельно: Песочница Kotlin