다들 알다시피 정렬 알고리즘을 쓰다 보면 Arrays.sort() 이러한 메소드를 많이 사용할 것이다.
처음에는 단순히 정렬해주는 것으로 알고 있었지만 좀 더 응용하시는 분들이 있기에 신기하기도 하고 좀 더 공부가 필요하다고 생각하여 글을 적어나가기로 했다.
또한 아직 모르시는 분들을 위해서 이번 간단하게 글을 적어나가기로 한다.
Comparator는 기본적으로 인터페이스(interface)이다. 이러한 말은 인터페이스 내에 선언된 메소드를 반드시 구현해야한다는 것이다.
만약 구현을 하게 된다면 추상 메소드를 구현해야 하는데, 딱 두 가지가 있다.
자 이제 정렬을 공부했다면, 한 번쯤은 다들 보셨을 compare이 보일 것이다. 필자는 이 compare 메소드를 좀 더 이해하기를 하고 활용하는 것을 보여주기 위해 글을 썼다고 봐도 무방하다. 하하
(equals는 다들 알고 있을 거라 예상하지만, 값이 같은지를 boolean으로 판별한다.)
public class test {
public static void main(String[] args) {
int a = 1;
int b = 2;
System.out.println(a > b ? +1 : (a==b ? 0 : -1));
}
}
기본적으로 구조는 위와 같은 구조이면 지금은 sout을 통해 음수 / 양수 / 0으로 표현했지만 이러한 표현을 통해 compare는 정렬을 이룬다. 하지만 이러한 길게 쓴 코딩은 우리 개발자들은 별로 안 좋아한다.
System.out.println(a - b);
이런 식으로 바꿔주면 똑같이 판별이 가능하다.
그렇다면 본격적으로 활용을 하게 된다면 - 필자는 arrays.sort를 기준으로 설명을 드릴려고 한다.
int[] arr = {10,22,55,1,2,6,7};
Arrays.sort(arr, new Comparator<>() {
@Override
public int compare(int o1, int o2) {
return o1 - o2;
}
});
실제로 구현하게 된다면 위와 같은 방식이 된다. 인자로 o1 과 o2가 들어와서 음수 / 양수 / 0 에 따라 서로의 위치를 바꾸게 된다.
하지만 이러한 방식은 어떻게 본다면 누구나 다 쓸 수 있을뿐더러 사실상 저러한 코드는 에러가 난다.
Arrays.sort(arr);
왜냐?? 굳이 구현해야 할 필요가 없기에 지우라는 에러가 뜬다. 조금 더 다른 예시를 들어보자!!
[1] 문제를 가정하자!
이차원 배열로 int형태가 들어온다.
해당 이차원 배열을 [i][0] 순으로 정렬을 하되, 만약 숫자가 같다면 그 다음 기준으로 [i][1] 순으로 정렬을 하자!
Arrays.sort(arr, new Comparator<int[]>() {
@Override
public int compare(int[] e1, int[] e2) {
if(e1[0] == e2[0]) {
return e1[1] - e2[1];
}
else {
return e1[0] - e2[0];
}
}
});
해당 솔루션으로 두 개의 인자를 비교하는 compare을 위와 같은 방식으로 커스텀해서 사용이 가능할 것이다.
[2] 문제를 가정하자!
배열로 String형태가 들어온다.
해당 배열을 String length으로 정렬을 하되, 만약 길이가 같다면 그 다음 기준으로 어순으로 정렬을 하자!
Arrays.sort(arr, new Comparator<String>() {
public int compare(String s1, String s2) {
// 단어 길이가 같을 경우
if (s1.length() == s2.length()) {
return s1.compareTo(s2);
}
// 그 외의 경우
else {
return s1.length() - s2.length();
}
}
});
처음에는 정렬해준다로 알고 있을 comparator를 좀 더 글로 풀어 나가니 좀 더 한결 나아진 기분이다. 이 이외에도 하나의 객체들을 집합으로 하는 class를 만들어서 비교도 가능하니 현업에서도 가끔씩은 쓰이지 않을까? 하는 생각이든다. 언제든지 공부하며, 배우는 습관을 가지자!
출처
https://blue-boy.tistory.com/182
https://docs.oracle.com/javase/8/docs/api/java/util/Comparator.html#method.summary
https://st-lab.tistory.com/243