Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

PriorityQueue 자바

자바에서 PriorityQueue를 사용하는 방법

우선 순위 큐는 프로그래밍에서 가장 높은 값을 가진 데이터 항목이 구조에서 먼저 처리되어야 하는 데이터 구조를 만드는 데 사용됩니다.

Java로 코딩할 때 우선 순위 큐를 구현하려는 상황이 발생할 수 있습니다. 이것이 Java Queue 인터페이스가 필요한 곳입니다. 그러나 Queue는 인터페이스이므로 코드에 직접 구현할 수 없습니다. 힙 데이터 구조로 우선순위 큐를 생성하려면 대신 PriorityQueue를 사용하는 것이 좋습니다.

이 튜토리얼에서는 Java에서 PriorityQueue의 기본 사항을 설명하고 큐를 만드는 방법을 살펴봅니다. 이 자습서에서는 대기열의 내용을 검색하고 조작하는 데 사용할 수 있는 PriorityQueue에서 제공하는 주요 메서드도 살펴봅니다.

Java 대기열 및 PriorityQueues

큐는 스택과 마찬가지로 작업이 수행되는 특정 순서가 있는 데이터 구조입니다. 대기열의 경우 FIFO(선입 선출) 순서로 작업이 수행됩니다. 즉, 목록의 첫 번째 항목은 항상 첫 번째 항목이 됩니다. 대기열은 삽입된 요소의 순서대로 정렬됩니다.

당신이 식당에 있고 주문을 했다고 가정해 봅시다. 가장 공정한 접근 방식이기 때문에 각 고객이 음식을 주문한 순서대로 제공되기를 원할 것입니다. 따라서 Jack 이후에 음식을 주문했다면 Jack 직후에 음식이 제공되기를 원할 것입니다. 큐의 예입니다.

이 자습서의 목적을 위해 Java에서 우선 순위 대기열을 만드는 데 사용되는 Queue 인터페이스의 PriorityQueue 구현에 중점을 둘 것입니다.

PriorityQueues는 우선 순위에 따라 요소가 정렬되는 대기열 유형입니다. 즉, 값이 5와 10인 대기열에서 10은 마지막에 추가된 경우에도 항상 대기열의 시작 부분에 있습니다.

우선순위 대기열 생성

Java에서 우선순위 큐를 생성하려면 먼저 java.util.PriorityQueue를 가져와야 합니다. 패키지. 이 패키지에는 대기열을 만드는 데 사용할 수 있는 PriorityQueue 메서드가 포함되어 있습니다. 다음 코드를 사용하여 PriorityQueue 패키지를 가져올 수 있습니다.

참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.

부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.

import java.util.PriorityQueue;

이제 PriorityQueue를 가져왔으므로 패키지를 사용하여 대기열을 만들 수 있습니다. 다음은 PriorityQueue를 만드는 데 사용되는 구문입니다.

PriorityQueue<DataType> queue_name = new PriorityQueue<>();

이를 분해해 보겠습니다.

  • 우선순위 대기열 프로그램에 우선 순위 대기열을 만들겠다고 알려줍니다.
  • 데이터 유형 대기열이 저장할 데이터 유형입니다.
  • queue_name 우리가 생성한 대기열에 할당될 변수의 이름입니다.
  • 새로운 PriorityQueue(); 우선 순위 대기열을 초기화합니다.

따라서 레스토랑의 고객 주문을 저장하는 대기열을 만들고 싶다고 가정합니다. 우리는 대기열이 각 고객의 테이블 번호를 저장하기를 원합니다. 다음 코드를 사용하여 이 스택을 만들 수 있습니다.

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

이 예에서는 orders라는 PriorityQueue의 인스턴스를 만들었습니다. 정수 값을 저장합니다. 대기열에서 요소는 FIFO 데이터 구조를 사용하여 액세스 및 제거됩니다.

PriorityQueue에 항목 추가

Java에서 큐의 각 요소를 item라고 합니다. .

대기열에 항목을 추가하려면 add()를 사용할 수 있습니다. 방법. 이 메서드는 대기열에 추가하려는 항목의 값이라는 하나의 매개변수를 허용합니다. 대기열이 가득 차면 add() 메서드는 예외를 반환합니다.

또한 offer()를 사용할 수 있습니다. 대기열에 항목을 추가하는 메서드입니다. add()의 차이점 및 offer() offer() 대기열이 가득 차면 false를 반환하는 반면 add() 예외가 발생합니다.

테이블 #22와 #17을 스택에 추가하려고 한다고 가정합니다. 테이블이 방금 점심 주문을 했기 때문입니다. 다음 코드를 사용하여 그렇게 할 수 있습니다.

import java.util.PriorityQueue;

class AddCustomer {
	public static void main(String[] args) {
		PriorityQueue<Integer> orders = new PriorityQueue<>();

		orders.add(22);
		System.println("Orders: " + orders);

		orders.offer(17);
		System.out.println("Updated orders: " + orders);
	}
}

코드 반환:

Orders: [22]
Updated orders: [22, 17]

예제를 분해해 보겠습니다. 먼저 나중에 코드에서 사용할 PriorityQueue 클래스를 가져왔습니다. 그런 다음 이 예제에 대한 코드를 저장하는 AddCustomer라는 클래스를 선언했습니다. 클래스 내부의 코드가 작동하는 방식은 다음과 같습니다.

  1. new PriorityQueue<>();를 사용합니다. orders라는 우선순위 큐를 생성하기 위해 .
  2. add()를 사용합니다. 스택에 테이블 #22를 추가하는 메소드입니다.
  3. Orders:라는 단어를 출력합니다. 그 뒤에 콘솔에 대한 스택의 내용이 나옵니다.
  4. offer()를 사용합니다. 스택에 테이블 #17을 추가하는 방법입니다.
  5. Updated orders:이라는 용어를 인쇄합니다. 그 다음에는 콘솔에 대한 스택의 수정된 내용이 나옵니다.

22는 스택에서 가장 먼저 나타나므로 요소를 제거할 때 가장 먼저 나오는 것입니다. 즉, 테이블 # 22는 스택의 맨 위에 있습니다. 테이블 #17은 스택의 두 번째 위치에 저장됩니다. 우선 순위 대기열은 FIFO 순서로 정렬된다는 것을 기억하십시오.

코드는 원래 주문이 포함된 배열을 반환한 다음 업데이트된 주문이 포함된 배열을 반환합니다.

PriorityQueue에서 항목 제거

PriorityQueue에서 항목을 제거하는 데 사용할 수 있는 두 가지 방법이 있습니다.

  • remove() 대기열에서 요소의 단일 인스턴스를 제거합니다.
  • poll() 대기열에서 첫 번째 요소를 제거하고 제거된 항목을 반환합니다.

우리의 sous-chef가 주문 #17을 처리하고 스택에서 제거하려고 한다고 가정합니다. 해당 주문이 처리된 후 주방장이 주문 #22를 준비했으며 스택에서 제거하려고 합니다.

주문 #17은 스택의 위치 2에 있고 주문 #22는 위치 1에 있습니다. 이 항목을 해당 순서로 제거하려고 합니다. 다음 코드를 사용하여 주문을 제거할 수 있습니다.

import java.util.PriorityQueue;

class RemoveOrders {
	public static void main(String[] args) {
		PriorityQueue<Integer> orders = new PriorityQueue<>();

		orders.add(22);
		orders.add(17);

		boolean removed = orders.remove(2);
		System.out.println("Was order #17 removed?" + removed);

		int second_removed = orders.poll();
		System.out.println("Order #" + second_removed + " was removed from the queue.");
	}
}

코드 반환:

Was order #17 removed? true
Order #22 was removed from the queue.

코드를 분해해 보겠습니다. 먼저 remove()를 사용했습니다. 스택의 위치 2에서 주문을 제거하는 메서드입니다. 삭제된 주문 #17입니다.

그런 다음 우리 코드는 Was order #17 removed?라는 메시지를 출력했습니다. 뒤에 remove()의 결과가 옵니다. 방법. remove() 스택에서 #17을 성공적으로 제거하여 메서드가 true를 반환했습니다.

다음으로 poll()을 사용했습니다. 스택의 최상위 항목을 제거하는 메서드입니다. 이 경우 주문 #22입니다. poll() 제거된 주문 #22 및 제거된 항목을 반환했습니다. 항목이 제거된 후 Order #[order number removed] was removed from the queue. 메시지를 인쇄했습니다. 콘솔에.

항목 검색

peek() 메서드는 대기열 항목(대기열의 첫 번째 항목)의 헤드를 검색하는 데 사용됩니다. 부셰프가 새로운 주문을 받을 준비가 되었기 때문에 스택의 다음 주문 값을 알고 싶어한다고 가정해 보겠습니다.

이 코드를 사용하여 다음 줄에 있는 고객의 테이블 번호를 검색할 수 있습니다.

import java.util.PriorityQueue;

class RetrieveOrder {
	public static void main(String[] args) {
		PriorityQueue<Integer> orders = new PriorityQueue<>();

		orders.add(22);
		orders.add(17);

		int next_order = orders.peek();
		System.out.println("The next order to be processed is table #" + next_order + ".");
	}
}

코드 반환:

The next order to be processed is table #22.

스택의 첫 번째 항목은 22이므로 peek()를 사용할 때 메서드에서 프로그램은 값 22를 반환합니다. 코드의 마지막 줄에 The next order to be processed is table #[number of first order in stack].라는 메시지를 출력합니다. , 여기서 스택의 첫 번째 주문 번호는 peek()에 의해 발견되었습니다. .

우선순위 대기열을 통해 반복

종종 대기열로 작업할 때 우선순위 대기열의 요소에 대해 반복자를 만들고 싶을 것입니다.

그렇게 하려면 iterator()를 사용할 수 있습니다. java.util.Iterator 패키지의 일부인 메소드. 하지만 iterator()를 사용하기 전에 메서드를 사용하려면 먼저 다음 코드를 사용하여 Iterator 패키지를 가져와야 합니다.

import java.util.Iterator;

레스토랑 주문 대기열에 있는 모든 항목의 목록을 콘솔에 출력하려고 한다고 가정해 보겠습니다. 다음 코드를 사용하여 그렇게 할 수 있습니다.

import java.util.PriorityQueue;
import java.util.Iterator;

class PrintOrders {
	public static void main(String[] args) {
		PriorityQueue<Integer> orders = new PriorityQueue<>();

		orders.add(22);
		orders.add(17);
orders.add(14);
orders.add(19);

		Iterator<Integer> iterate = orders.iterator();
		while(iterate.hasNext()) {
			System.out.println(iterate.next());
		}
	}
}

코드 반환:

22
17
14
19

코드에서 먼저 4개의 값을 대기열에 추가합니다. 그런 다음 iterator()를 사용합니다. 우선 순위 대기열의 모든 항목을 통과하는 데 사용할 수 있는 반복자를 만드는 메서드입니다. 그런 다음 while 반복자의 모든 항목을 실행하는 루프 — orders의 모든 항목에 대해 queue — 그리고 queue의 다음 값을 출력합니다.

추가 PriorityQueue 메소드

PriorityQueue 클래스와 함께 자주 사용되는 세 가지 메서드가 더 있습니다. 다음과 같습니다.

메서드 이름 설명
크기() 대기열의 길이를 반환합니다.
toArray() 대기열을 배열로 변환합니다.
포함(요소 이름) 큐에서 요소를 검색합니다.

결론

PriorityQueue 클래스는 Java에서 큐 인터페이스를 구현하는 데 사용됩니다. 대기열은 FIFO 데이터 구조를 사용하므로 첫 번째 항목이 가장 먼저 나오는 항목입니다.

이 자습서는 Java의 대기열 및 PriorityQueues의 기본 사항을 살펴보았습니다. 또한 대기열을 만드는 방법과 대기열에서 항목을 검색하고 대기열을 조작하는 데 사용할 수 있는 주요 방법에 대해서도 논의했습니다.

이제 전문가처럼 Java PriorityQueue 클래스를 사용하는 데 필요한 도구가 생겼습니다!