코딩테스트 문제를 풀 때, 배열, 리스트 등 컬렉션에 대한 정렬 작업이 필요한 경우가 많다. 일반적으로 배열은 Arrays.sort()를 사용하고, 리스트는 Collections.sort()를 사용한다. 하지만 이것들은 기본형으로만 사용할 때, 오름차순으로만 정렬된다. Comparator 인터페이스를 사용하면 순서를 조작하여 경우에 따라 정렬을 할 수 있다.
Comparator란?
객체 간 값의 비교를 위해 필요한 메서드를 정리한 인터페이스
Comparator 인터페이스를 사용할 때는 반드시 compare 함수를 Override 해줘야 한다.
public interface Comparator<T>{
int compare(T o1, T o2);
}
Comparator의 compare 함수의 인가값은 두 개가 필요하며, 이 값을 대소비교하여 정렬 작업을 처리한다.
이 값을 대소비교한 반환값으로 정렬 작업을 수행한다고 했는데 데이터의 종류에 따라 반환 표현을 다르게 한다.
- 데이터가 수치형 데이터(숫자)일 경우 : return o1 - o2 or return o2 - o1
- 데이터가 객체 데이터(문자열)일 경우 : return o1.compareTo(o2) or return o2.compareTo(o1)
- 자바의 compareTo 메서드가 자연적으로 오름차순 비교를 기반으로 함
오름차순 정렬
- 반환값(o1 - o2)이 음수일 경우, o1 < o2 이므로 o1이 o2보다 앞에 위치한다.
- 반환값(o1 - o2)이 양수일 경우, o1 > o2 이므로 o1이 o2보다 뒤에 위치한다.
- 반환값(o1 - o2)이 0일 경우, o1 = o2 으로 두 요소는 동일한 값으로 간주되어 순서에 영향을 주지 않는다.
import java.util.*;
public class AscendingSortExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 3, 9, 1, 6);
Collections.sort(numbers, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return a.compareTo(b);
}
});
System.out.println("오름차순 정렬된 리스트: " + numbers);
}
}
내림차순 정렬
- 반환값(o2 - o1)이 음수일 경우, o2 < o1 이므로 o1이 o2보다 앞에 위치한다.
- 반환값(o2 - o1)이 양수일 경우, o2 > o1 이므로 o1이 o2보다 뒤에 위치한다.
- 반환값(o2 - o1)이 0일 경우, o2 = o1 으로 두 요소는 동일한 값으로 간주되어 순서에 영향을 주지 않는다.
import java.util.*;
public class DescendingSortExample {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(5, 3, 9, 1, 6);
Collections.sort(numbers, new Comparator<Integer>() {
@Override
public int compare(Integer a, Integer b) {
return b.compareTo(a);
}
});
System.out.println("내림차순 정렬된 리스트: " + numbers);
}
}728x90