기본 데이터타입이 아닌 객체(Object)를 정렬해야 할 때가 있다.
또한, 자바에서 기본으로 제공해주는 정렬함수로는 수행하기 힘든 복잡한 방식/기준의 정렬이 필요할 때도 있다.
백준 #1931 회의실 배정 문제가 그 예시이다.
이럴 때 쓸 수 있는 방법은 여러 가지가 있는데, 그 중 Comparator의 compare 함수를 재정의하여 사용하는 방법을 정리해보겠다.
자바에 정의되어있는 Comparator를 오버라이드하여 내가 정한 기준에 따라 객체를 정렬하도록 만드는 방식이다.
어떤 새로운 형식의 객체를 정의하든지 상관 없다.
정렬의 방식과 기준도 자유롭게 정할 수 있다.
1차원 배열을 정렬할 때는 Arrays.sort()
List 등을 정렬할 때는 Collections.sort()를 사용한다.
사용법
Comparator에 포함된 함수 compare는 두 개의 객체를 매개변수로 받아서 음수 또는 양수를 리턴한다.
이걸 오버라이드해서 언제 음수를 리턴하고 언제 양수를 리턴할지 맘대로 정하면 된다.
오름차순 정렬
첫 번째 매개변수가 더 클 때 양수를, 두 번째 매개변수가 더 클 때 음수를 리턴하도록 오버라이드
내림차순 정렬
첫 번째 매개변수가 더 클 때 음수를, 두 번째 매개변수가 더 클 때 양수를 리턴하도록 오버라이드
예시
Comparator<Integer> cp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
//수의 크기를 기준으로 오름차순 정렬
if(o1>o2)return 1;
else return -1;
}
};
Arrays.sort(numbers, cp);
Integer 타입의 객체를 오름차순으로 정렬하기
Comparator<Integer> cp = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
// TODO Auto-generated method stub
//수의 크기를 기준으로 내림차순 정렬
if(o1<o2)return 1;
else return -1;
}
};
Arrays.sort(numbers, cp);
Integer 타입의 객체를 내림차순으로 정렬하기
Comparator<Apple> cp = new Comparator<Apple>() {
@Override
public int compare(Apple o1, Apple o2) {
// TODO Auto-generated method stub
int size1 = o1.size;
int size2 = o2.size;
int sweet1 = o1.sweet;
int sweet2 = o2.sweet;
if(size1<size2) return -1;
else if(size1 == size2){
if(sweet1<sweet2) return -1;
else return 1;
}
else return 1;
}
};
Arrays.sort(apples, cp);
사과를 크기 기준으로 오름차순 정렬하되, 크기가 같은 것끼리는 당도 기준으로 오름차순 정렬하기
※이때 사과(Apple)는 필드로 int size, int sweet를 갖는 객체이다.
단어를 길이순으로 정렬하되 길이가 같은 단어끼리는 사전순으로 정렬해야 하는 문제.
'Java 공부 > Java 일반' 카테고리의 다른 글
자바에서 문자열의 형식을 설정하기 : String.format() (0) | 2022.03.29 |
---|---|
String을 char[]로 바꾸어주는 toCharArray() (0) | 2022.02.22 |
자바로 트리 만들기 (0) | 2022.02.12 |
부분문자열을 얻어올 때 사용하는 substring() (0) | 2022.02.11 |
개행문자 (0) | 2022.01.28 |