Java PriorityQueue nedir? Örnek bir senaryo ile Java kodu



Java'da PriorityQueue sınıfı, bir öncelik kuyruğunu uygulayan bir koleksiyondur. Bu kuyruk, öğeleri doğal sıralamalarına göre veya bir Comparator aracılığıyla sağlanan bir sıralamaya göre saklar. PriorityQueue sınıfı, Java'nın java.util paketinin bir parçasıdır ve Queue arayüzünü uygular. Öncelik kuyruklarının(PriorityQueue) ana özellikleri şunlardır:

  • Sıralama: Öğeler, doğal sıralamalarına (örneğin, sayılar küçükten büyüğe) veya bir Comparator ile belirtilen bir sıraya göre saklanır.

  • Veri Yapısı: Genellikle bir ikili heap yapısı kullanılarak uygulanır, bu da hem ekleme (offer) hem de en yüksek öncelikli öğeyi çıkarma (poll) işlemlerinin verimli bir şekilde yapılmasını sağlar.

  • Ekleme ve Kaldırma: offer metodu, kuyruğa yeni bir öğe eklemek için kullanılır. poll metodu, kuyruktan en yüksek öncelikli öğeyi kaldırır ve döndürür. Eğer kuyruk boşsa, poll null değerini döndürür.

  • Görüntüleme: peek metodu, en yüksek öncelikli öğeyi kaldırmadan görüntülemek için kullanılır. Kuyruk boşsa, null değerini döndürür.

  • Boyut ve Kapasite: PriorityQueue başlangıçta belirli bir kapasite ile oluşturulabilir ve ihtiyaç duyuldukça otomatik olarak genişler.

  • İterasyon: PriorityQueue üzerinde iterasyon yapmak, öğeleri kesin bir sırayla döndürmez. Belirli bir sırayla elemanlara erişmek için öğeleri kuyruktan kaldırmak gerekir.

PriorityQueue sınıfı, özellikle performans açısından verimli bir şekilde öncelikli elemanlara erişim gerektiren durumlarda, örneğin görev planlayıcılarında veya minimum/maximum hesaplamalarında kullanışlıdır.

Örnek bir senaryo ile Java kodu

Senaryo: Hasta Sıralaması

Bir hastanede, acil servise gelen hastaların tedavi önceliğini belirlemek için bir öncelik kuyruğu kullanılıyor. Her hastanın bir "aciliyet derecesi" vardır. Bu derece ne kadar yüksekse, hastanın tedavi önceliği o kadar yüksek olur. Hastalar öncelik sırasına göre tedavi edilir.

Bu senaryoda, hastaları Patient adında bir sınıf ile temsil edeceğiz. Her Patient nesnesinin bir ismi ve bir aciliyet derecesi olacak. PriorityQueue sınıfını kullanarak hastaları aciliyet derecelerine göre sıralayacağız.


Kod:

java

Copy code

import java.util.PriorityQueue;

import java.util.Comparator;


// Hasta sınıfı

class Patient {

    String name;

    int urgency;

    public Patient(

        final String name,

        final int urgency

    ) {

        this.name = name;

        this.urgency = urgency;

    }


    @Override

    public String toString() {

        return name + " (Aciliyet Derecesi: " + urgency + ")";

    }

}

public class HospitalQueue {

    public static void main(String[] args) {

        // Öncelik kuyruğunu, aciliyet derecesine göre ters sıralama ile oluşturuyoruz

        PriorityQueue<Patient> queue = new PriorityQueue<>(Comparator.comparingInt(p -> -p.urgency));

        // Hastaları kuyruğa ekliyoruz

        queue.offer(new Patient("Ali", 5));

        queue.offer(new Patient("Ayşe", 3));

        queue.offer(new Patient("Ahmet", 10));

        queue.offer(new Patient("Fatma", 1));

      // Hastaları öncelik sırasına göre tedavi ediyoruz

        while (!queue.isEmpty()) {

            Patient nextPatient = queue.poll();

            System.out.println("Tedavi edilen             hasta: " + nextPatient);

        }

    }

}

Bu kodda, Patient sınıfı tanımlanır ve her hastanın ismi ve aciliyet derecesi saklanır. HospitalQueue sınıfının main metodunda, PriorityQueue sınıfından bir nesne oluşturulur ve Comparator ile hastaların aciliyet derecelerine göre sıralanması sağlanır. Daha sonra hastalar kuyruğa eklenir ve öncelik sırasına göre tedavi edilir. Bu sırada, en yüksek aciliyet derecesine sahip hasta öncelikle tedavi edilir.

queue.poll() edildiğinde ilk önce hangi hasta kuruktan çekilir?

Bu örnekte, queue.poll() çağrıldığında, PriorityQueue içindeki en yüksek aciliyet derecesine sahip hasta ilk olarak kuyruktan çekilir. PriorityQueue burada Comparator kullanılarak ters sıralama ile oluşturulduğu için, en yüksek aciliyet derecesine (yani en büyük sayıya) sahip hasta en önce çıkarılır.

Kodda tanımlanan hastalar ve aciliyet dereceleri şöyleydi:

Ali, Aciliyet Derecesi: 5

Ayşe, Aciliyet Derecesi: 3

Ahmet, Aciliyet Derecesi: 10

Fatma, Aciliyet Derecesi: 1

Bu durumda, queue.poll() ilk çağrıldığında, en yüksek aciliyet derecesine (10) sahip olan "Ahmet" isimli hasta kuyruktan çekilir.

Please Select Embedded Mode To Show The Comment System.*

Daha yeni Daha eski

نموذج الاتصال