English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

تعليميات Java الأساسية

Java Flow Control

Java Arrays

Java Object-Oriented (I)

Java Object-Oriented (II)

Java Object-Oriented (III)

معالجة الاستثناءات Java

Java List

Java Queue (الصف)

Java Map Collections

Java Set Collections

Java Input/Output (I/O)

Java Reader/Writer

مواضيع أخرى في Java

PriorityQueue Java

في هذا الدليل، سنتعلم كيفية استخدام فئة PriorityQueue في إطار العمل الخاص بـ Java Collections عبر أمثلة.

يقدم类 PriorityQueue وظائف بنية البيانات堆.

إنها تحقق منواجهة Queue.

مختلفة عن الصف العادي، يتم استرجاع عناصر مجموعة المرتبة بالترتيب المرتب.

افترض أننا نريد استرجاع العناصر بالترتيب الأصلي. في هذه الحالة، يكون العنصر الأول في الصف الأول هو الأصغر. بعد استرجاع هذا العنصر، سيصبح العنصر التالي الأصغر في الصف الأول.

يجب ملاحظة أن عناصر مجموعة المرتبة قد لا تكون مرتبة. ولكن، دائمًا ما يتم استرجاع العناصر بالترتيب المطلوب.

إنشاء PriorityQueue

لإنشاء مجموعة مرتبة، يجب علينا استيراد مكتبة java.util.PriorityQueue. بعد استيراد المكتبة، يمكننا استخدام الطريقة التالية لإنشاء مجموعة مرتبة في Java.

PriorityQueue<Integer> numbers = new PriorityQueue<>();

في هذا السياق، قمنا بإنشاء مجموعة مرتبة لا تحتوي على أي معلمات. في هذه الحالة، يكون العنصر الأول في الصف الأول هو الأصغر في الصف.

لكن، يمكننا استخدام واجهة Comparator لتخصيص ترتيب العناصر. سنقوم بشرح هذا في الجزء الخلفي من الدليل.

PriorityQueue方法

فئةPriorityQueue توفر جميع طرق واجهةQueue.

إدراج العنصر فيPriorityQueue

  • add() - إدراج العنصر المحدد في الصف. إذا كانت الصف ممتلئة، فسيتم إطلاق استثناء.

  • offer() - إدراج العنصر المحدد في الصف. إذا كانت الصف ممتلئة، فسيتم عودةfalse.

على سبيل المثال،

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //إنشاء قائمة الأولوية
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        //استخدام طريقةadd()
        numbers.add(4);
        numbers.add(2);
        System.out.println("PriorityQueue: " + numbers);
        //استخدام طريقةoffer()
        numbers.offer(1);
        System.out.println("PriorityQueue المعدلة: " + numbers);
    }
}

نتائج الإخراج

PriorityQueue: [2, 4]
PriorityQueue المعدلة: [1, 4, 2]

في هذا السياق، قمنا بإنشاء قائمة الأولوية تحت اسمnumbers. قمنا بإدراج 4 و2 في الصف.

على الرغم من أن 4 تم إدراجه قبل 2، إلا أن رأس الصف هو 2. هذا لأن رأس قائمة الأولوية هو العنصر الأصغر في الصف.

ثم، سنقوم بإدراج 1 في الصف. الآن تم إعادة ترتيب الصف لضمان أن العنصر الأصغر 1 يتم تخزينه في بداية الصف.

زيارة عناصرPriorityQueue

للوصول إلى العنصر في قائمة الأولوية، يمكننا استخدام طريقةpeek(). هذه الطريقة تعود العنصر في بداية الصف. على سبيل المثال،

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //إنشاء قائمة الأولوية
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);
        //استخدام طريقةpeek()
        int number = numbers.peek();
        System.out.println("زيارة العنصر: " + number);
    }
}

نتائج الإخراج

PriorityQueue: [1, 4, 2]
زيارة العنصر: 1

حذف عناصرPriorityQueue

  • remove() - إزالة العنصر المحدد من الصف

  • poll() - عودة وإزالة العنصر من بداية الصف

على سبيل المثال،

import java.util.PriorityQueue;
class Main {
    public static void main(String[] args) {
        //إنشاء قائمة الأولوية
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.println("PriorityQueue: " + numbers);
        //استخدام طريقةremove()
        boolean result = numbers.remove(2);
        System.out.println("هل تم حذف العنصر 2؟ " + result);
        //استخدام طريقةpoll()
        int number = numbers.poll();
        System.out.println("العنصر المزيل باستخدامpoll(): " + number);
    }
}

نتائج الإخراج

PriorityQueue: [1, 4, 2]
هل تم حذف العنصر 2؟ true
العنصر المزيل باستخدامpoll(): 1

استعراضPriorityQueue

للتنقل بين عناصر قائمة الأولوية، يمكننا استخدام طريقة iterator(). لاستخدام هذه الطريقة، يجب علينا استيراد حزمة java.util.Iterator. على سبيل المثال،

import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
    public static void main(String[] args) {
        //إنشاء قائمة اولوية
        PriorityQueue<Integer> numbers = new PriorityQueue<>();
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        System.out.print("استخدام iterator() لاستكشاف قائمة الأولوية: ");
        //استخدام iterator()
        Iterator<Integer> iterate = numbers.iterator();
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

نتائج الإخراج

استخدام iterator() لاستكشاف قائمة الأولوية: 1, 4, 2,

طرق أخرى لقائمة الأولوية

الطريقةوصف المحتوى
contains(element)البحث عن عنصر معين في قائمة الأولوية. إذا تم العثور على العنصر، يتم إرجاع true، وإلا يتم إرجاع false.
size()إرجاع طول قائمة الأولوية.
toArray()تحويل قائمة الأولوية إلى مصفوفة وإرجاعها.

مقارن مقارنة قائمة الأولوية(comparator)

في جميع الأمثلة السابقة، يتم استرجاع عناصر قائمة الأولوية بترتيب طبيعي (تصاعدي). ولكن يمكننا تعريف هذا الترتيب.

لذلك، نحتاج إلى إنشاء فئة comparator خاصة بنا، وهي تستخدم واجهة Comparator. على سبيل المثال

import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
    public static void main(String[] args) {
        //إنشاء قائمة اولوية
        PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
        numbers.add(4);
        numbers.add(2);
        numbers.add(1);
        numbers.add(3);
        System.out.print("PriorityQueue: "+ numbers);
    }
}
class CustomComparator implements Comparator<Integer> {}}
    @Override
    public int compare(Integer number1, Integer number2) {
        int value = number1.compareTo(number2);
        // ترتيب العناصر بشكل عكسي
        if (value > 0) {
            return -1;
        }
        else if (value < 0) {
            return 1;
        }
        else {
            return 0;
        }
    }
}

نتائج الإخراج

PriorityQueue: [4, 3, 1, 2]

في المثال السابق، أنشأنا حاوية الأولويات باستخدام فئة CustomComparator كمعامل.

فئة CustomComparator تحقق من واجهة Comparator.

ثم، نعيد كتابة طريقة compare()، التي تجعل الرأس من العناصر أكبر عددًا الآن.