자바에서 Comparator를 활용해 PriorityQueue(우선순위 큐)를 구현하는 방법을 예제 코드와 함께 알아보겠습니다. 아래 예제는 사용자 정의 클래스의 객체를 특정 기준(나이)에 따라 정렬하여 처리하는 과정을 보여줍니다.
예제 코드
import java.util.*;
public class Demo{
public static void main(String[] args){
Scanner my_scan = new Scanner(System.in);
PriorityQueue<Demo_class> my_pq = new PriorityQueue<Demo_class>(3, new demoComparator());
Demo_class obj_1 = new Demo_class("Joe", 25);
my_pq.add(obj_1);
Demo_class obj_2 = new Demo_class("Goldberg", 27);
my_pq.add(obj_2);
while (!my_pq.isEmpty()){
System.out.println(my_pq.poll().getName());
}
}
}
class demoComparator implements Comparator<Demo_class>{
public int compare(Demo_class s1, Demo_class s2){
if (s1.age < s2.age)
return 1;
else if (s1.age > s2.age)
return -1;
return 0;
}
}
class Demo_class{
public String name;
public int age;
public Demo_class(String name, int age){
this.name = name;
this.age = age;
}
public String getName(){
return name;
}
}
실행 결과
Goldberg Joe
코드 상세 설명
Demo 클래스에는 프로그램의 진입점인 main 함수가 포함되어 있습니다. main 함수 안에서는 Scanner 객체와 우선순위 큐(PriorityQueue)가 선언되며, 이때 큐의 초기 용량(3)과 함께 정렬 기준을 결정할 demoComparator 객체가 생성자에 전달됩니다.
이후 Demo_class 타입의 인스턴스 두 개(Joe, 25살 / Goldberg, 27살)를 생성하고 add() 메서드를 통해 큐에 추가합니다.
while 루프는 isEmpty() 메서드로 큐가 비어 있는지 검사하고, 비어 있지 않으면 poll() 메서드를 호출해 우선순위가 가장 높은 요소를 하나씩 꺼낸 뒤 getName()으로 해당 요소의 이름을 출력합니다.
demoComparator 클래스는 Comparator<Demo_class> 인터페이스를 구현합니다. compare() 메서드는 두 인스턴스의 나이를 비교하는데, 첫 번째 객체의 나이가 더 작으면 1을, 더 크면 -1을 반환합니다. 이러한 반환 값의 규칙 때문에 요소들은 나이가 많은 순서(내림차순)로 정렬되며, 실행 결과에서 27살인 Goldberg가 25살인 Joe보다 먼저 출력되는 것을 확인할 수 있습니다.
Demo_class는 이름(name)과 나이(age)를 멤버 변수로 가지며, 두 값을 초기화하는 생성자와 이름을 반환하는 getName() 메서드를 정의하고 있습니다.