Menu
Coddy logo textTech

Podsumowanie — kolejka priorytetowa

Część sekcji Programowanie obiektowe ścieżki Kotlin w Coddy. Lekcja 41 z 57.

challenge icon

Wyzwanie

Średni

Zbuduj 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 metody push(item), pop() i peek(), 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) albo null, właściwość size, metodę items() (migawkę tylko do odczytu w kolejności pobierania) oraz metodę drain(n), która pobiera maksymalnie n elementów i zwraca je jako List<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

Poćwicz samodzielnie: Edytor online Kotlin