JAVA/자료구조

JAVA Priority Queue 우선순위 큐 사용법과 정렬 기준 정의

수달하나 2021. 8. 17. 17:07

 

기본적으로 Integer 값 혹은 String 같은 타입을 담는 우선순위 큐는 아래와 같은 방식으로 사용하면 된다.

import java.util.*;

// Priority_Queue 오름차순 정의
PriorityQueue<String> priorityQueueAsc = new PriorityQueue<String>();

// Priority_Queue 내림차순 정의
PriorityQueue<String> priorityQueueDes = new PriorityQueue<String>(Collections.reverseOrder());

// 삽입
priorityQueueAsc.add("java");
priorityQueueAsc.add("c++");
priorityQueueAsc.add("python");
        
String str ="";

// 첫번째 값 반환 (첫번째 값이 없을 경우 null 반환)
str = priorityQueueAsc.peek();

// 첫번째 값 삭제 후 반환 (첫번째 값이 없을 경우 에러 발생)
str = priorityQueueAsc.remove();

// 첫번째 값 반환 후 삭제 (첫번째 값이 없을 경우 null 반환)
str = priorityQueueAsc.poll();

// 우선순위 큐 비우기 (반환 값 없음)
priorityQueueAsc.clear();

// 우선순위 큐 크기 반환
int size = priorityQueueAsc.size();

// 우선순위 큐 모든 요소 반환
Object[] array = priorityQueueAsc.toArray();

 

하지만 배열 혹은 ArrayList 를 담거나 다른 구조체 등을 담기 위해서는 어떤 값을 기준으로 우선 순위를 정할지 직접 작성해주어야 한다. 

 

첫 번째 방법은 새로운 클래스를 정의 하고 Comparable을 상속받아 오름차순의 기준을 직접 정의하는 것이다.

compareTo 함수를 오버라이딩 하여 재정의 하면 priorityQueue 를 바로 사용할 수 있다. 

class People implements Comparable<People>{
	String name;
	int bigThree1rm;

	People(String name, int bigThree1rm){
		this.name = name;
		this.bigThree1rm = bigThree1rm;
	}

	@Override //bigThree1rm 을 기준으로 오름차순 정렬
	public int compareTo(People o) {
		return this.bigThree1rm > o.bigThree1rm ? 1 : -1;
	}
}

PriorityQueue<People> priorityQueue = new PriorityQueue<People>();

 

두 번째 방법은 priorityQueue 를 정의 할 때 Comparator를 통해 compare 함수를 오버라이딩 하는 방법이다

static class People{
	String name;
	int bigThree1rm;

	People(String name, int bigThree1rm){
		this.name = name;
		this.bigThree1rm = bigThree1rm;
	}
}

PriorityQueue<People> priorityQueueAsc = new PriorityQueue<People>(new Comparator<People>() {
	@Override //bigThree1rm 을 기준으로 오름차순 정렬
	public int compare(People o1, People o2) {
		return o1.bigThree1rm > o2.bigThree1rm ? 1 : -1;
	}
});

위와 같은 방식은 직접 정의한 객체에서 사용 뿐 아니라 다른 자료구조에서도 사용이 가능하기 때문에 예를 들어 ArrayList를 우선순위 큐에 삽입할 때 사용하면 편하게 문제를 해결 할 수 있다.