Podsumowanie — kolejka priorytetowa
Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 41 z 57.
Wyzwanie
ŚredniZbuduj kolejkę priorytetową, która działa dla dowolnego typu z priorytetem. Dostarczono Prioritized (z priority) oraz klasy danych Job i Ticket.
TaskQueue<T : Prioritized>ma metodypush(item),pop()ipeek(), które usuwają lub zwracają element o najwyższym priorytecie (spośród elementów o równym priorytecie ten, który dodano jako pierwszy) albonull, właściwośćsize, metodęitems()(migawkę tylko do odczytu w kolejności pobierania) oraz metodędrain(n), która pobiera maksymalnienelementów i zwraca je jakoList<T>.- Funkcja generyczna
countUrgent(queue, min)przyjmuje kolejkę dowolnego typu z priorytetem i zwraca liczbę jej elementów, których priorytet jest co najmniej równy podanej wartości.
Dostarczony kod odczytuje polecenia job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (dla zgłoszeń) lub sizes, wyświetla odpowiedź na każde z nich, a na końcu urgent: wraz z pilnymi zadaniami i zgłoszeniami, które nadal znajdują się w kolejce.
Umieść swój kod w plikach TaskQueue.kt, Prioritized.kt, Job.kt i Ticket.kt. Plik Main.kt zawiera dostarczony kod wejścia/wyjścia i nie można go edytować.
Spróbuj swoich sił
fun main() {
// Dostarczony kod wejścia/wyjścia: pozostaw go bez zmian
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)}")
}
Wszystkie lekcje w sekcji Programowanie obiektowe
1Klasy i obiekty
Praca z plikamiDefiniowanie klasKonstruktory główneBloki init i walidacjaKonstruktory dodatkowePodsumowanie — karta biblioteczna4Dziedziczenie
Klasy otwarte i podklasyNadpisywanie składowychsuper i konstruktoryKlasy abstrakcyjnePodsumowanie – katalog pracowników7Klasy specjalne
Klasy danychKlasy wyliczenioweHierarchie zapieczętowaneequals, hashCode, toStringPodsumowanie — śledzenie zamówień10Wzorce projektowe, część 2
Delegowanie za pomocą byWzorzec dekoratoraWzorzec budowniczegoWzorzec stanu2Właściwości i hermetyzacja
Własne akcesoryModyfikatory widocznościPrywatne setterylazy i lateinitPowtórka – konto bankowe5Interfejsy
Deklarowanie interfejsówMetody domyślneWiele interfejsówInterfejsy jako typyPowtórzenie – metody płatności8Typy generyczne
Funkcje generyczneKlasy generyczneOgraniczenia typówKowariancja i kontrawariancja: in i outPodsumowanie — kolejka priorytetowa11Projekt: Zarządzanie biblioteką
Książki i czytelnicyWypożyczanie książekPoćwicz samodzielnie: Edytor online Kotlin