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를 우선순위 큐에 삽입할 때 사용하면 편하게 문제를 해결 할 수 있다.