понеділок, 27 квітня 2020 р.

Клас PriorityQueue (Java)

PriorityQueue дозволяє реалізувати чергу на основі пріоритету. Така черга може бути корисна, наприклад, у разі необхідності обслуговування клієнтів згідно пріоритету. При зберіганні чисел в пріоритетній черзі, така черга гарантує, що першим елементом завжди буде найменший елемент. При цьому не гарантується ніякий стабільний послідовний порядок збереження елементів. Після додавання або видалення елементу з пріоритетної черги, порядок зберігання елементів в цій черзі змінюється таким чином, що в голові черги опиняється найменший елемент згідно його природнього порядку або згідно заданого компаратора.

PriorityQueue має наступні конструктори:

PriorityQueue()  //початковий об’єм становить 11
PriorityQueue(int  початковий_об’єм) 
PriorityQueue(Comparator comparator)
PriorityQueue(int  початковий_об'єм,  Comparator  компаратор) 
PriorityQueue(Collection  с) 
PriorityQueue(PriorityQueue  с) 
PriorityQueue(SortedSet  с)
Таким чином в разі потреби можна задати власний компаратор для видачі елементів у потрібному нам порядку.

Клас PriorityQueue, java, колекціїPriorityQueue не може містити null. PriorityQueue розширює AbstractQueue та реалізує інтерфейси Serializable, Iterable, Collection, Queue.

Реалізація інтерфейсу Queue говорить нам, що в PriorityQueue доступні такі методи роботи з чергою:

  • add(E e) – додати вказаний елемент у чергу
  • element() – отримати, але не видаляти, елемент з голови черги 
  • offer(E e)- додати визначений елемент у чергу 
  • peek() – отримати елемент з голови черги, але не видаляти його. Повертає null, якщо черга порожня 
  • poll() – отримати та видалити елемент з голови черги 
  • remove() - отримати та видалити елемент з голови черги

Крім того в PriorityQueue доступні методи, що наявні і в інших колекціях як то: clear(), comparator(), contains(), iterator(), spliterator(), size(), toArray() тощо.

Приклад:
import java.util.PriorityQueue;

public class TestPriorityQueue {
    public static void main(String[] args) {
        PriorityQueue<Integer> pq= new PriorityQueue<>(11);
        pq.add(750);
        pq.add(50);
        pq.offer(1);
        pq.add(300);
        pq.add(25);
        pq.add(2);
        pq.offer(20);
        pq.add(5);
        pq.add(40);
        System.out.println("Порядок зберігання елементів"+pq);

        // Отримуємо і видаляємо елемент з голови черги 
        while (!pq.isEmpty()) {        
            System.out.println("Отримали: "+pq.poll());
            System.out.println("Новий порядок:"+pq);
        }     
    } 
} 
 
Результат:
Порядок зберігання елементів[1, 5, 2, 25, 300, 50, 20, 750, 40]
Отримали: 1
Новий порядок:[2, 5, 20, 25, 300, 50, 40, 750]
Отримали: 2
Новий порядок:[5, 25, 20, 750, 300, 50, 40]
Отримали: 5
Новий порядок:[20, 25, 40, 750, 300, 50]
Отримали: 20
Новий порядок:[25, 50, 40, 750, 300]
Отримали: 25
Новий порядок:[40, 50, 300, 750]
Отримали: 40
Новий порядок:[50, 750, 300]
Отримали: 50
Новий порядок:[300, 750]
Отримали: 300
Новий порядок:[750]
Отримали: 750
Новий порядок:[]
Таким чином за допомогою методу poll() (його можна також замінити методом remove()), ми можемо отримувати елементи масиву у відсортованому порядку, незважаючи на те, що в самій пріоритетній черзі елементи зберігаються у іншому порядку.

Немає коментарів:

Дописати коментар