Menu
Coddy logo textTech

Recapitulação - Fila de prioridade

Parte da seção Programação Orientada a Objetos do Journey de Kotlin da Coddy. Lição 41 de 57.

challenge icon

Desafio

Médio

Crie uma fila de prioridade que funcione para qualquer tipo priorizado. Prioritized (com priority) e as classes de dados Job e Ticket são fornecidas.

  • TaskQueue<T : Prioritized> tem push(item), pop() e peek(), que removem ou retornam o item com a maior prioridade (o que foi inserido primeiro entre prioridades iguais) ou null, size, items() (um instantâneo somente para leitura na ordem de remoção) e drain(n), que remove até n itens e os retorna como uma List<T>.
  • A função genérica countUrgent(queue, min) recebe uma fila de qualquer tipo priorizado e retorna quantos de seus itens têm pelo menos essa prioridade.

O código fornecido lê os comandos job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (tickets) ou sizes, exibe cada resposta e, por fim, urgent: com os jobs e tickets urgentes que ainda estão na fila.

Seu código deve estar em TaskQueue.kt, Prioritized.kt, Job.kt e Ticket.kt. Main.kt contém o código fornecido de entrada/saída e não pode ser editado.

Experimente você mesmo

fun main() {
    // Código de entrada/saída fornecido: mantenha-o 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 as lições de Programação Orientada a Objetos

Pratique por conta própria: Playground de Kotlin