Heap 구조에 대해서는 tosuccess.tistory.com/31?category=853902 를 참고해주세요!
우선순위 큐는 힙(Heap)구조를 가지며, 정렬 기준에 따라 가장 큰 값이 먼저 나오는 MaxHeap을 만들 수 있고, 가장 작은 값이 나오는 MinHeap을 만들 수 있다.
이번에는 우선순위 큐를 정렬하는 방법에 대해 다뤄보겠다.!
1. 우선순위 큐 사용하기
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
priorityQueue.add(4);
priorityQueue.add(6);
priorityQueue.add(5);
priorityQueue.add(1);
while(!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll()); //remove()를 사용하셔도 됩니다.
}
}
|
cs |
/*출력*/
1 4 5 6
기본적으로 정수형에 대해서는 오름차순 정렬을 합니다.
2. 우선순위 큐 반대로 정렬
1
2
3
4
5
6
7
8
9
10
11
12
13
|
public static void main(String[] args) {
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
priorityQueue.add(4);
priorityQueue.add(6);
priorityQueue.add(5);
priorityQueue.add(1);
while(!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll()); //remove()를 사용하셔도 됩니다.
}
}
|
cs |
/*출력*/
6 5 4 1
Collections 클래스에 reverseOrder() 을 사용하여 MaxHeap구조를 만들 수 있습니다.
3. 정렬 기준 만들기
가끔 스트링의 문자열 중 2번째 자리로 정렬하거나, 이외의 특정 기준으로 정렬하고 싶을 때는 Comparator을 사용합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
public static void main(String[] args) {
PriorityQueue<String> priorityQueue = new PriorityQueue<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.charAt(1) < o2.charAt(1)) {
return -1;
}else if(o1.charAt(1) > o2.charAt(1)) {
return 1;
}else {
return 0;
}
/*
return o1.compareTo(o2); //전체 오름 차순
return o2.compareTo(o1); //전체 내림차순
*/
}
});
priorityQueue.add("apple");
priorityQueue.add("banana");
priorityQueue.add("benq");
priorityQueue.add("keyboard");
while(!priorityQueue.isEmpty()) {
System.out.println(priorityQueue.poll()); //remove()를 사용하셔도 됩니다.
}
}
|
cs |
/*출력*/ 2번 째 자리에 있는 a e e p 순으로 정렬됨
banana
keyboard
benq
apple
new Comparator<자료형>() 에 익숙하지 않은 분들이 있습니다.
코드를 기준으로 String형으로 정렬을 하고 싶을 때 주석에 있는 o1.compareTo(o2) (오름차순)을 사용하시면 되고,
특별히 두번 째 자리로만 정렬하고 싶다면 위의 코드 같이 작성하시면 됩니다.(오름차순)
if ~else 부분이 이해가 잘 안 가시는 분들은 <, >을 기준으로 정렬하고 싶은 곳을 음수, 양수로 생각하시면 편합니다.
예를 들어 첫 줄처럼 o1.charAt(1) < o2.charAt(1) 일 경우 -1 이면 '<' 기준으로 왼쪽이니까. 작은 것을 기준으로 정렬하는구나~ 하시면 좋을 것 같습니다.
else if 에서는 '>' 기준 오른쪽이 작은 거니까 1. 같을 때는 0으로 정렬해주지 않습니다.
'프로그래밍 언어 > JAVA(자바)' 카테고리의 다른 글
[자바/java] 이차원 배열 90도 회전시키기, int[][] rotate (0) | 2020.09.09 |
---|---|
[자바/java] 이차원 배열 클론, Clone(), Object.Clone() (0) | 2020.09.09 |
[자바/java] Map, HashMap - key, value 값 가져오기(feat. Set, Iterator) (0) | 2020.09.03 |
[자바/java] Set, HashSet 사용법 데이터 삽입, 삭제, 출력 (0) | 2020.09.01 |
[자바/java] Arrays.fill()을 이용한 int[] 배열 , 이차원 배열 값 채우기 (0) | 2020.08.30 |