Menu
Coddy logo textTech

Repaso - Cola de prioridad

Parte de la sección Programación orientada a objetos del Journey de Kotlin de Coddy. Lección 41 de 57.

challenge icon

Desafío

Intermedio

Construye una cola de prioridad que funcione para cualquier tipo priorizado. Se proporcionan Prioritized (con priority) y las clases de datos Job y Ticket.

  • TaskQueue<T : Prioritized> tiene push(item), pop() y peek(), que eliminan o devuelven el elemento con la prioridad más alta (el que se insertó primero entre los de igual prioridad) o null, size, items() (una instantánea de solo lectura en orden de extracción) y drain(n), que extrae hasta n elementos y los devuelve como una List<T>.
  • La función genérica countUrgent(queue, min) recibe una cola de cualquier tipo priorizado y devuelve cuántos de sus elementos tienen al menos esa prioridad.

El código proporcionado lee los comandos job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (tickets) o sizes, imprime cada respuesta y finalmente urgent: con los trabajos y tickets urgentes que aún están en la cola.

Tu código debe estar en TaskQueue.kt, Prioritized.kt, Job.kt y Ticket.kt. Main.kt contiene el código de entrada/salida proporcionado y no se puede editar.

Pruébalo tú mismo

fun main() {
    // Código de entrada/salida suministrado: déjalo como está
    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)}")
}

Todas las lecciones de Programación orientada a objetos

Practica por tu cuenta: Playground de Kotlin