Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

مراجعة - طابور الأولوية

جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 41 من 57.

challenge icon

التحدي

متوسط

أنشئ طابور أولوية يعمل مع أي نوع ذي أولوية. تم توفير Prioritized (مع priority) وفئتي البيانات Job وTicket.

  • يحتوي TaskQueue<T : Prioritized> على push(item) وpop() وpeek()، التي تزيل العنصر ذي الأولوية الأعلى أو تعيده (العنصر الذي أُضيف أولًا بين العناصر ذات الأولوية المتساوية)، أو تعيد null، بالإضافة إلى size وitems() (لقطة للقراءة فقط بترتيب الإزالة) وdrain(n)، التي تزيل ما يصل إلى n عناصر وتعيدها كقائمة من النوع List<T>.
  • تأخذ الدالة العامة countUrgent(queue, min) طابورًا من أي نوع ذي أولوية، وتعيد عدد عناصره التي لها تلك الأولوية على الأقل.

يقرأ الكود الموفَّر الأوامر job build 3 وticket 17 5 ada وpop jobs وpeek tickets وdrain 2 (للتذاكر) أو sizes، ويطبع كل رد، ثم يطبع في النهاية urgent: متبوعًا بالوظائف والتذاكر العاجلة التي لا تزال في الطابور.

ضع الكود الخاص بك في TaskQueue.kt وPrioritized.kt وJob.kt وTicket.kt. يحتوي Main.kt على كود الإدخال/الإخراج الموفَّر ولا يمكن تعديله.

جرّب بنفسك

fun main() {
    // كود الإدخال/الإخراج المُزوَّد: أبقِه كما هو
    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)}")
}

جميع دروس البرمجة كائنية التوجه

تدرّب بنفسك: Playground لـ Kotlin