Рубрики
Без рубрики

Пример очереди приоритетов Java (Приоритетная очередь)

Пример очереди приоритетов Java, Очередь приоритетов в Java, Пример сравнения очереди приоритетов Java, Блокирующая очередь, учебник по приоритетной блокировке.

Автор оригинала: Pankaj Kumar.

Добро пожаловать в очередь приоритетов в учебнике по Java. Мы знаем, что Очередь следует F irst- I n- F irst- O ut модели, но иногда нам нужно обрабатывать объекты в очереди на основе приоритета. Именно тогда используется Java Приоритетная очередь .

Например, предположим, что у нас есть приложение, которое генерирует отчеты по акциям для ежедневной торговой сессии. Это приложение обрабатывает много данных и требует времени для их обработки. Таким образом, клиенты отправляют запрос в приложение, которое на самом деле находится в очереди, но мы хотим сначала обработать премиум-клиентов, а после них-стандартных клиентов. Так что в этом случае Приоритетная очередь реализация на java может быть действительно полезной.

Очередь приоритетов Java

Класс PriorityQueue был представлен в Java 1.5 и является частью платформы Java Collections .

Приоритетная очередь-это неограниченная очередь, основанная на куче приоритетов, и элементы приоритетной очереди по умолчанию упорядочены в естественном порядке. Мы можем предоставить компаратор для заказа во время создания приоритетной очереди.

Очередь приоритетов Java не допускает значений null , и мы не можем создавать очередь приоритетов несопоставимых объектов. Мы используем java Comparable и Comparator для сортировки объектов, а очередь приоритетов использует их для приоритетной обработки своих элементов.

Главой приоритетной очереди является элемент наименьший , основанный на естественном порядке или порядке, основанном на компараторе, если имеется несколько объектов с одинаковым порядком, то он может опрашивать любой из них случайным образом. Когда мы опрашиваем очередь, она возвращает головной объект из очереди.

Размер очереди приоритетов Java не ограничен, но мы можем указать начальную емкость во время ее создания. Когда мы добавляем элементы в очередь приоритетов, ее емкость автоматически увеличивается.

Приоритетная очередь не является потокобезопасной , поэтому java предоставляет Класс PriorityBlockingQueue , реализующий интерфейс BlockingQueue для использования в многопоточности java среде.

Реализация очереди приоритетов Java обеспечивает O(log(n)) время для метода запроса и удаления из очереди.

Давайте рассмотрим пример очереди приоритетов java для естественного упорядочения, а также с помощью компаратора.

У нас есть собственный класс Customer , который не предоставляет никаких типов заказов, поэтому, когда мы попытаемся использовать его с приоритетом, мы должны предоставить для этого объект-компаратор.

У нас есть собственный класс || Customer||, который не предоставляет никаких типов заказов, поэтому, когда мы попытаемся использовать его с приоритетом, мы должны предоставить для этого объект-компаратор.

package com.journaldev.collections;

public class Customer {
	
	private int id;
	private String name;
	
	public Customer(int i, String n){
		this.id=i;
		this.name=n;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}
	
}

Мы будем использовать генератор случайных чисел java для генерации случайных объектов клиентов. Для естественного упорядочения я буду использовать Integer, который также является классом java-оболочки .

Вот наш окончательный тестовый код, который показывает, как использовать очередь приоритетов в java.

Вот наш окончательный тестовый код, который показывает, как использовать очередь приоритетов в java.

package com.journaldev.collections;

import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Random;

public class PriorityQueueExample {

	public static void main(String[] args) {
		
		//natural ordering example of priority queue
		Queue integerPriorityQueue = new PriorityQueue<>(7);
		Random rand = new Random();
		for(int i=0;i<7;i++){
			integerPriorityQueue.add(new Integer(rand.nextInt(100)));
		}
		for(int i=0;i<7;i++){
			Integer in = integerPriorityQueue.poll();
			System.out.println("Processing Integer:"+in);
		}
		
		//PriorityQueue example with Comparator
		Queue customerPriorityQueue = new PriorityQueue<>(7, idComparator);
		addDataToQueue(customerPriorityQueue);
		
		pollDataFromQueue(customerPriorityQueue);
		
	}
	
	//Comparator anonymous class implementation
	public static Comparator idComparator = new Comparator(){
		
		@Override
		public int compare(Customer c1, Customer c2) {
            return (int) (c1.getId() - c2.getId());
        }
	};

	//utility method to add random data to Queue
	private static void addDataToQueue(Queue customerPriorityQueue) {
		Random rand = new Random();
		for(int i=0; i<7; i++){
			int id = rand.nextInt(100);
			customerPriorityQueue.add(new Customer(id, "Pankaj "+id));
		}
	}
	
	//utility method to poll data from queue
	private static void pollDataFromQueue(Queue customerPriorityQueue) {
		while(true){
			Customer cust = customerPriorityQueue.poll();
			if(cust == null) break;
			System.out.println("Processing Customer with ID="+cust.getId());
		}
	}

}

Обратите внимание, что я использую анонимный класс java для реализации интерфейса компаратора и создания нашего компаратора на основе идентификаторов.

Когда я запускаю выше примера тестовой программы очереди приоритетов java, она генерирует следующий вывод.

Processing Integer:9
Processing Integer:16
Processing Integer:18
Processing Integer:25
Processing Integer:33
Processing Integer:75
Processing Integer:77
Processing Customer with ID=6
Processing Customer with ID=20
Processing Customer with ID=24
Processing Customer with ID=28
Processing Customer with ID=29
Processing Customer with ID=82
Processing Customer with ID=96

Из вывода видно, что наименьший элемент был во главе и был вытащен первым. Если мы не предоставим компаратор при создании Очереди приоритетов клиентов , он вызовет ClassCastException во время выполнения.

Exception in thread "main" java.lang.ClassCastException: com.journaldev.collections.Customer cannot be cast to java.lang.Comparable
	at java.util.PriorityQueue.siftUpComparable(PriorityQueue.java:633)
	at java.util.PriorityQueue.siftUp(PriorityQueue.java:629)
	at java.util.PriorityQueue.offer(PriorityQueue.java:329)
	at java.util.PriorityQueue.add(PriorityQueue.java:306)
	at com.journaldev.collections.PriorityQueueExample.addDataToQueue(PriorityQueueExample.java:45)
	at com.journaldev.collections.PriorityQueueExample.main(PriorityQueueExample.java:25)

Это все для примера очереди приоритетов java, если вам понравилась эта статья, пожалуйста, поделитесь и прокомментируйте.