Java PriorityQueue 완벽 가이드: 기초, 연산, 커스텀 정렬
Java PriorityQueue
Java 컬렉션 프레임워크의 PriorityQueue 클래스를 명확한 예제와 모범 사례를 통해 살펴봅니다.
PriorityQueue 클래스는 힙 자료구조를 구현하며 Queue 인터페이스를 만족하여, 삽입 순서가 아닌 우선순위에 기반한 효율적인 요소 검색을 제공합니다.
PriorityQueue 생성하기
java.util.PriorityQueue를 임포트하여 시작하세요:
import java.util.PriorityQueue;
PriorityQueue<Integer> numbers = new PriorityQueue<>();
이 기본 설정은 자연 순서(오름차순)를 사용합니다. 생성 시 Comparator를 제공하여 순서를 커스터마이징할 수 있습니다.
PriorityQueue 주요 메서드
Queue 인터페이스에 정의된 모든 메서드를 사용할 수 있으며, 몇 가지 큐 전용 연산이 추가됩니다.
요소 삽입하기
add() – 요소 추가, 큐가 가득 차면 예외 발생
offer() – 요소 추가, 큐가 가득 차면 false 반환
예제:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
System.out.println("PriorityQueue: " + numbers);
numbers.offer(1);
System.out.println("Updated PriorityQueue: " + numbers);
}
}
출력
PriorityQueue: [2, 4] Updated PriorityQueue: [1, 4, 2]
4가 2보다 먼저 추가되었지만 헤드는 2로 유지됩니다. 가장 작은 요소이기 때문입니다. 1을 추가하면 큐가 재정렬되어 1이 헤드가 됩니다.
요소 접근하기
peek()로 헤드를 제거하지 않고 조회하세요:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
int number = numbers.peek();
System.out.println("Accessed Element: " + number);
}
}
출력
PriorityQueue: [1, 4, 2] Accessed Element: 1
요소 제거하기
remove() – 지정된 요소 삭제, 성공 시 true 반환
poll() – 헤드 검색 및 제거
예제:
import java.util.PriorityQueue;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.println("PriorityQueue: " + numbers);
boolean result = numbers.remove(2);
System.out.println("Is the element 2 removed? " + result);
int number = numbers.poll();
System.out.println("Removed Element Using poll(): " + number);
}
}
출력
PriorityQueue: [1, 4, 2] Is the element 2 removed? true Removed Element Using poll(): 1
PriorityQueue 순회하기
iterator()로 순회합니다(java.util.Iterator 필요):
import java.util.PriorityQueue;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>();
numbers.add(4);
numbers.add(2);
numbers.add(1);
System.out.print("PriorityQueue using iterator(): ");
Iterator<Integer> iterate = numbers.iterator();
while (iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
출력
PriorityQueue using iterator(): 1, 4, 2,
추가 메서드
| 메서드 | 설명 |
contains(element) | 요소가 큐에 존재하면 true 반환 |
size() | 큐의 요소 수 반환 |
toArray() | 큐를 배열로 변환 |
Comparator로 커스텀 정렬하기
자연 순서를 뒤집거나 임의의 커스텀 우선순위를 구현하려면 큐 생성 시 Comparator를 제공하세요:
import java.util.PriorityQueue;
import java.util.Comparator;
class Main {
public static void main(String[] args) {
PriorityQueue<Integer> numbers = new PriorityQueue<>(new CustomComparator());
numbers.add(4);
numbers.add(2);
numbers.add(1);
numbers.add(3);
System.out.print("PriorityQueue: " + numbers);
}
}
class CustomComparator implements Comparator<Integer> {
@Override
public int compare(Integer a, Integer b) {
return b.compareTo(a); // 역순
}
}
출력
PriorityQueue: [4, 3, 1, 2]
커스텀 비교자로 헤드가 가장 큰 요소가 됩니다. 자세한 내용은 Java Comparator API를 참조하세요.