Menu
Coddy logo textTech

Récapitulatif - File de priorité

Fait partie de la section Programmation orientée objet du Journey Kotlin de Coddy. Leçon 41 sur 57.

challenge icon

Défi

Moyen

Construisez une file de priorité qui fonctionne pour tout type priorisé. Prioritized (avec priority) et les classes de données Job et Ticket sont fournies.

  • TaskQueue<T : Prioritized> possède push(item), pop() et peek(), qui suppriment ou renvoient l’élément ayant la priorité la plus élevée (celui ajouté en premier parmi les priorités égales) ou null, size, items() (un instantané en lecture seule dans l’ordre de retrait) et drain(n), qui retire jusqu’à n éléments et les renvoie sous forme de List<T>.
  • La fonction générique countUrgent(queue, min) prend une file de n’importe quel type priorisé et renvoie le nombre de ses éléments ayant au moins cette priorité.

Le code fourni lit les commandes job build 3, ticket 17 5 ada, pop jobs, peek tickets, drain 2 (tickets) ou sizes, affiche chaque réponse et affiche finalement urgent: avec les tâches et tickets urgents qui sont toujours dans les files.

Votre code doit être placé dans TaskQueue.kt, Prioritized.kt, Job.kt et Ticket.kt. Main.kt contient le code fourni pour les entrées et sorties et ne peut pas être modifié.

Essayez vous-même

fun main() {
    // Code d'entrée/sortie fourni : le garder tel quel
    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)}")
}

Toutes les leçons de Programmation orientée objet

Entraînez-vous par vous-même : Playground Kotlin