Java-da PriorityBlockingQueue


Java PriorityBlockingQueueBaxılıb 32

Java-da PriorityBlockingQueue

PriorityBlockingQueue, Java-da BlockingQueue interfeysini həyata keçirən və AbstractQueue sinifini genişləndirən bir sinifdir. Eyni zamanda BlockingQueue məlumat quruluşunu həyata keçirir. Bir PriorityBlockingQueue-un işi a-ya bənzəyir Prioritet Sıra ancaq bir bloklama axtarış əməliyyatını tətbiq edir. Bu, mənbə olmadığı zaman elementlər əlavə etməyə çalışdığımız zaman, OutOfMemoryError-u atacağı deməkdir. Eynilə, növbə boş olduqda elementləri silə bilmirik.

Xüsusiyyətləri

  • Sıfır dəyərləri PriorityBlockingQueue-da saxlaya bilmirik.
  • Sərhədsizdir və başlanğıc gücü 11 ilə dinamik olaraq böyüyür.
  • İterator () və ya spliterator () metodlarından istifadə edərək elementləri müəyyən bir qaydada götürə biləcəyimizə zəmanət yoxdur.
  • Elementləri sıralamaq üçün ya Arrays.sort istifadə edə bilərik, ya da xüsusi siniflərdən və ya müqayisələrdən istifadə etmək olar.
  • Bir PriorityBlockingQueue-da əlavə etdiyimiz elementlərin ClassCastException atacağı bir Müqayisəli interfeys tətbiq etməsi lazımdır.
  • Java-da PriorityBlockingQueue mövzu təhlükəsizdir.
  • Prioritet elementləri silmək və başqa bir kolleksiyada saxlamaq üçün draTo () metodundan istifadə edə bilərik.

Hiyerarşi

Java-da PriorityBlockingQueuePin

Java-da PriorityBlockingQueue qurucuları

konstruktortəsvir
PriorityBlockingQueue ()Tutumu 11 olan standart boş bir PriorityBlockingQueue yaradır
PriorityBlockingQueue (Kolleksiya c)Kolleksiyada göstərilən elementlərlə PriorityBlockingQueue yaradır
PriorityBlockingQueue (int initialCapacity)Müəyyən edilmiş başlanğıc tutumu olan boş bir PriorityBlockingQueue yaradır
PriorityBlockingQueue (int başlanğıc gücü, Müqayisələndirici c)Müəyyən edilmiş başlanğıc tutumu olan boş bir PriorityBlockingQueue yaradır və müqayisə aparatına əsaslanan elementləri sifariş edir

Java-da PriorityBlockingQueue metodları

ÜsultəsvirParametr
Mantı əlavə et (String e)Göstərilən elementi növbənin sonuna əlavə edire - əlavə ediləcək element.
Qaytarma dəyəri - Doğru
Boolean addAll (Collection c)Sıra göstərilən elementlər toplusunu əlavə edir.c - əlavə ediləcək elementlər toplusu
Qaytarma dəyəri - doğrudur
boşluq təmiz ()Növbədəki bütün elementləri təmizləyir.
Müqayisə komparator ()Elementləri sifariş etmək üçün müqayisəni qaytarır
Mantiq tərkibində (Nesne o) varNövbədə göstərilən elementin olub-olmadığını yoxlayırQaytarma dəyəri - növbədə element varsa, doğrudur
BooleanAll (Collection c) ehtiva edirNövbədə kolleksiyadakı bütün elementlərin olub-olmadığını yoxlayırQaytarma dəyəri - növbə bütün elementləri ehtiva edərsə doğrudur
int drainTo (Koleksiyon c)Bütün elementləri növbədən çıxarır və göstərilən kolleksiyaya əlavə edirc - Elementlərin əlavə edilməli olduğu kolleksiya
int drainTo (Collection c, int maxElements)Göstərilən maksimum element sayını növbədən çıxarır və göstərilən kolleksiyaya əlavə edirc - Elementlərin əlavə edilməli olduğu kolleksiya
maxElements - Maksimum köçürülə bilən element sayı
Tamsayı element ()Sıradakı ilk elementi (baş) qaytarır
Mantiq bərabərdir (O ​​obyekt)Növbədə göstərilən bütün elementləri dəqiq qaydada ehtiva etdiyini müqayisə edirQaytarma dəyəri - obyekt elementləri növbə ilə uyğun gəlsə doğrudur
Boole isEmpty ()Növbənin boş olub olmadığını yoxlayırQaytarma dəyəri - növbədə dəyər olmadıqda doğrudur
Təkrarlayıcı iterator ()Növbənin iteratorunu ardıcıllıqla alırQaytarma dəyəri - təkrarlayıcı
Mantı təklifi (Tam e)Göstərilən elementi quyruq kimi daxil edire - əlavə ediləcək element
Mantı təklifi (Tam e, uzun fasilə, TimeUnit vahidi)Göstərilən elementi növbəyə əlavə edire - əlavə ediləcək element
Tam say ()Növbənin ilk elementini alır (baş)Növbənin boş olduğu halda sıfır qaytarır
Tam say ()Növbənin ilk elementini götürür və silir (baş)Növbənin boş olduğu halda sıfır qaytarır
Tam say anketi (uzun fasilə, TimeUnit vahidi)Element mövcud deyilsə, göstərilən vaxtı gözləyərək baş elementini növbədən alır və çıxarırfasilə - gözləmə vaxtı
boş yerə qoyun (Tamsayı e)Göstərilən elementi növbəyə əlavə edire - daxil ediləcək element
int qalanCapacity ()Tamsayı qaytarır.MAX_VALUE
Tamsayı götür ()İlk elementi növbədən çıxarır
Mantı sil (Nesne o)Göstərilən obyektin mövcudluğunu ilk növbəni növbədən çıxarıro - Sökülməsi lazım olan element
Qaytarma dəyəri - növbədə element varsa, doğrudur
Boolean kaldırAll (Collection c)Kolleksiyadakı bütün elementlərin ilk meydana gəlməsini mövcud olduqda növbədən çıxarırc - elementlərin toplanması
Qaytarma dəyəri - növbədə kolleksiya varsa doğrudur
Boolean tutmaAll (Collection c)Koleksiyonda göstərilən bütün elementləri növbədə saxlayır. Digər elementlər silinəcəkdirc - saxlanılması lazım olan elementlər toplusu
Qaytarma dəyəri - çağırılan metod sayəsində növbə dəyişsə, doğrudur
int ölçüsü ()Növbənin ölçüsünü götürürQaytarma dəyəri - növbənin ölçüsü
Spliterator spliterator ()Növbədəki elementlərin üzərinə bir ayırıcı qaytarır
Tamsayı götür ()Növbənin başını götürür və götürür
Obyekt [] toArray ()Bir sıra elementləri müvafiq ardıcıllıqla qaytarırQaytarma dəyəri - Növbədəki bütün elementlərin müvafiq ardıcıllıqla düzülməsi
String toString ()Elementlər kolleksiyasının bir Sətir təmsilini qaytarırQaytarma dəyəri - Vergül və boşluqla ayrılmış və [] daxilində olan sıra elementlərinin sətri

Nümunə: PriorityBlockingQueue-a elementlər əlavə edin

Aşağıdakı nümunə Java-da bir PriorityBlockingQueue-a elementlərin necə əlavə olunacağını göstərir. Add (), offer () və ya put () metodundan istifadə edərək dəyərlər daxil edə bilərik, dəyərlər toplusunu daxil etmək üçün addAll () metodundan istifadə edə bilərik.

import java.util.concurrent.PriorityBlockingQueue;

public class AddElementsPriorityBlockingQueue {

  public static void main(String[] args) {
    PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>();
    pb.add(30);
    pb.add(50);
    pb.add(10);
    
    System.out.println("Elements in PriorityBlockingQueue after add: " + pb);
    
    PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>();
    pbq.add(70);
    pbq.add(90);
    
    pb.addAll(pbq);
    
    System.out.println("Elements in PriorityBlockingQueue after addAll: " + pb);
    
    pb.put(100);
    System.out.println("Elements in PriorityBlockingQueue after put: " + pb);

    pb.offer(110);
    System.out.println("Elements in PriorityBlockingQueue after offer: " + pb);
    
  }

}
Elements in PriorityBlockingQueue after add: [10, 50, 30]
Elements in PriorityBlockingQueue after addAll: [10, 50, 30, 70, 90]
Elements in PriorityBlockingQueue after put: [10, 50, 30, 70, 90, 100]
Elements in PriorityBlockingQueue after offer: [10, 50, 30, 70, 90, 100, 110]

Nümunə: PriorityBlockingQueue-dan elementləri silin

Aşağıdakı nümunədə, Remove () metodundan istifadə edərək elementlərin necə silinəcəyini göstəririk. Anket () metodundan istifadə edərək baş elementini də çıxara bilərik. Yalnız elementlər toplusunu qorumaq və digər elementləri silmək üçün retainAll () metodundan istifadə edə bilərik, bütün kolleksiya elementlərini çıxarmaq üçün isə RemoveAll () metodundan istifadə edə bilərik.

import java.util.concurrent.PriorityBlockingQueue;

public class DeleteElementsPriorityBlockingQueue throws InterruptedException {

  public static void main(String[] args) {
    PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>();
    pb.add(30);
    pb.add(50);
    pb.add(10);
    
    PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>();
    pbq.add(70);
    pbq.add(90);
    pbq.add(100);
    
    pb.addAll(pbq);
    
    System.out.println("Elements in PriorityBlockingQueue after add: " + pb);
    
    pb.remove();
    pb.remove(90);
    System.out.println("Elements in PriorityBlockingQueue after remove: " + pb);
    
    Integer val = pb.poll();
    System.out.println("Removed element using poll: " + val);

    Integer value = pb.take();
    System.out.println("Removed element using take: " + value);
    
    pb.retainAll(pbq);
    System.out.println("Elements in PriorityBlockingQueue after retainAll: " + pb);
    
    pb.removeAll(pbq);
    System.out.println("Elements in PriorityBlockingQueue after removeAll: " + pb);
  }

}
Elements in PriorityBlockingQueue after add: [10, 50, 30, 70, 90, 100]
Elements in PriorityBlockingQueue after remove: [30, 50, 100, 70]
Removed element using poll: 30
Removed element using take: 50
Elements in PriorityBlockingQueue after retainAll: [70, 100]
Elements in PriorityBlockingQueue after removeAll: []

Misal: PriorityBlockingQueue elementlərinə daxil olun

PriorityBlockingQueue-da müəyyən bir dəyərin olub olmadığını yoxlamaq üçün, ehtiva edən () metodundan, elementlər toplusunun mövcudluğunu yoxlamaq üçün, ehtiva edən () metodundan istifadə edə bilərik. Aşağıdakı nümunədə element () və peek () metodlarından istifadə edərək baş elementin necə alınacağını görə bilərik.

import java.util.concurrent.PriorityBlockingQueue;

public class AccessElementsPBQ {

  public static void main(String[] args) {
    PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>();
    pb.add(30);
    pb.add(50);
    pb.add(10);
    pb.add(20);
    pb.add(40);
    
    PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>();
    pbq.add(70);
    pbq.add(90);
    
    pb.addAll(pbq);
    
    System.out.println(pb.contains(100));
    System.out.println(pb.contains(20));
    System.out.println(pb.containsAll(pbq));
    
    System.out.println("Head element using the element() method: " + pb.element());
    System.out.println("Head element using the peek method: " + pb.peek());
    
  
  }

}
false
true
true
Head element using the element() method: 10
Head element using the peek method: 10

Nümunə: PriorityBlockingQueue üzərində təkrarlayın

İterator () metodundan istifadə edərək Java-da bir PriorityBlockingQueue-da bütün dəyərləri keçə bilərik.

import java.util.Iterator;
import java.util.concurrent.PriorityBlockingQueue;

public class IteratePBQ {

  public static void main(String[] args) {
    PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>();
    pb.add(30);
    pb.add(50);
    pb.add(10);
    pb.add(20);
    pb.add(40);
    
    //Using iterator
    System.out.println("Using iterator:");
    Iterator<Integer> i = pb.iterator();
    
    while(i.hasNext())
      System.out.println(i.next());
    
  }

}
Using iterator:
10
20
30
50
40

Nümunə: drainTo () metodu

Aşağıda drainTo () metodundan istifadə edərək elementlərin bir kolleksiyadan necə çıxarılacağını və başqa kolleksiyaya köçürülməsinin bir nümunəsidir. DrainTo () metodundan istifadə etdikdən sonra ilk növbənin boş olduğunu və ikinci növbənin pbq-nin dəyərləri ilə dolduğunu görə bilərik.

import java.util.concurrent.PriorityBlockingQueue;

public class drainToDemo {

  public static void main(String[] args) {
    PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>();
    pb.add(30);
    pb.add(50);
    pb.add(10);
    pb.add(20);
    pb.add(40);
    
    PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>();
    pb.drainTo(pbq);
    
    System.out.println("Elements in the first collection: " + pb);
    System.out.println("Elements in the second collection: " + pbq);

  }

}
Elements in the first collection: []
Elements in the second collection: [10, 20, 30, 40, 50]

Nümunə: PriorityBlockingQueue-da müqayisədən istifadə

PriorityQueue-da elementləri xüsusi bir müqayisəyə əsasən sifariş edə bilərik. Aşağıdakı nümunədə, ən yüksək elementi baş kimi qaytaran xüsusi bir müqayisəçi yaratırıq.

import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;

public class ComparatorPBQ {

  public static void main(String[] args) {
    PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>(5, new SampleComparator());
    pb.add(30);
    pb.add(50);
    pb.add(10);
    pb.add(20);
    pb.add(40);
    
    System.out.println(pb);
    

  }

}

Müqayisələndirici.java

import java.util.Comparator;
public class SampleComparator implements Comparator<Integer> {

  @Override
  public int compare(Integer x, Integer y) {
    if(x < y)
      return 1;
    else
      return -1;
  }

}
[50, 40, 10, 20, 30]

Nümunə: Bloklama axtarış əməliyyatı

Aşağıda PriorityBlockingQueue istifadə edərək bloklama axtarış əməliyyatını göstərmək üçün bir nümunə verilmişdir. Yeni bir mövzu başladığında, hər tam ədədi yazdırmadan əvvəl bir saniyə gözləyir. Take () metodu, göstərilən vaxt üçün dəyəri gözləyərək elementi alır və silir.

import java.util.concurrent.PriorityBlockingQueue;
import java.util.concurrent.TimeUnit;

public class BlockingRetrievalDemo {

  public static void main(String[] args) throws InterruptedException {
    PriorityBlockingQueue<Integer> pb = new PriorityBlockingQueue<Integer>();
    new Thread(() ->
    {
      System.out.println("Waiting...");
      
      try {
        while(true) {
          Integer t = pb.take();
          System.out.println("Value: " + t);
          
          Thread.sleep(TimeUnit.SECONDS.toMillis(1));
        }
      }
      catch(Exception e) {
        e.printStackTrace();
      }
    }
    ).start();
    
    Thread.sleep(TimeUnit.SECONDS.toMillis(2));
    pb.add(10);
    
    Thread.sleep(TimeUnit.SECONDS.toMillis(2));
    pb.add(20);
    
    Thread.sleep(TimeUnit.SECONDS.toMillis(2));
    pb.add(30);
  }

}
Waiting...
Value: 10
Value: 20
Value: 30

Misal: Kolleksiyadan PriorityBlockingQueue yaratmaq

Aşağıdakı nümunə, a-dan bir PriorityBlockingQueue yaratmaq qaydasını göstərir Əlaqəli siyahı kolleksiya. LinkedList və PriorityBlockingQueue-dəki dəyərləri sadaladığı sırada bir fərq olduğunu görə bilərik.

import java.util.LinkedList;
import java.util.concurrent.PriorityBlockingQueue;

public class PBQCollection {

  public static void main(String[] args) {
    LinkedList<Integer> l = new LinkedList<Integer>();
    l.add(10);
    l.add(80);
    l.add(40);
    l.add(20);
    l.add(30);
    System.out.println("Elements in LinkedList: " + l);
    
    PriorityBlockingQueue<Integer> p = new PriorityBlockingQueue<Integer>(l);
    System.out.println("Elements in PriorityBlockingQueue: " + p);
    

  }

}
Elements in LinkedList: [10, 80, 40, 20, 30]
Elements in PriorityBlockingQueue: [10, 20, 40, 80, 30]

Nümunə: Daxili komparatordan istifadə edərək çeşidləmə

Dəyəri Java-da bir PriorityBlockingQueue-da daxili müqayisədən istifadə edərək sıralaya bilərik. Aşağıdakı nümunədə, əks müqayisəli daxili reverseOrder metodu istifadə edərək dəyərləri tərs qaydada çap edirik.

import java.util.Comparator;
import java.util.concurrent.PriorityBlockingQueue;

public class ComparatorPBQDemo {

  public static void main(String[] args) {
    PriorityBlockingQueue<Integer> pbq = new PriorityBlockingQueue<Integer>(5, Comparator.reverseOrder());
    
    pbq.add(20);
    pbq.add(40);
    pbq.add(60);
    pbq.add(80);
    pbq.add(100);
    
    System.out.println(pbq);
  }

}
[100, 80, 40, 20, 60]

 

arayış

Şərh yaz

Translate »
1