Rückblick – Prioritätswarteschlange
Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 41 von 57.
Aufgabe
MittelErstelle eine Prioritätswarteschlange, die für jeden priorisierten Typ funktioniert. Prioritized (mit priority) und die Datenklassen Job und Ticket werden bereitgestellt.
TaskQueue<T : Prioritized>verfügt überpush(item),pop()undpeek(), die das Element mit der höchsten Priorität (bei gleicher Priorität das zuerst eingefügte) entfernen oder zurückgeben, odernull, sowie übersize,items()(eine schreibgeschützte Momentaufnahme in der Reihenfolge des Entfernens) unddrain(n), das bis zunElemente entfernt und sie alsList<T>zurückgibt.- Die generische Funktion
countUrgent(queue, min)erhält eine Warteschlange eines beliebigen priorisierten Typs und gibt zurück, wie viele ihrer Elemente mindestens diese Priorität haben.
Der bereitgestellte Code liest die Befehle job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (Tickets) oder sizes, gibt jede Antwort aus und schließlich urgent: mit den dringenden Jobs und Tickets, die noch in der Warteschlange stehen.
Dein Code gehört in TaskQueue.kt, Prioritized.kt, Job.kt und Ticket.kt. Main.kt enthält den bereitgestellten Eingabe-/Ausgabecode und kann nicht bearbeitet werden.
Probier es selbst
fun main() {
// Mitgelieferter Ein-/Ausgabecode: belasse ihn wie er ist
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)}")
}
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground