مراجعة - طابور الأولوية
جزء من قسم البرمجة كائنية التوجه في رحلة Kotlin على Coddy. الدرس 41 من 57.
التحدي
متوسطأنشئ طابور أولوية يعمل مع أي نوع ذي أولوية. تم توفير 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)}")
}
جميع دروس البرمجة كائنية التوجه
1الفئات والكائنات
العمل مع الملفاتتعريف الفئاتالمنشئات الأساسيةكتل init والتحقق من الصحةالمنشئات الثانويةمراجعة - بطاقة المكتبة4الوراثة
الأصناف المفتوحة والأصناف الفرعيةتجاوز الأعضاءsuper والمنشئاتالأصناف المجرّدةمراجعة - دليل الموظفينتدرّب بنفسك: Playground لـ Kotlin