[Java] 정렬 알고리즘 Comparator에 대해

이진영·2023년 1월 16일
0

개요


다들 알다시피 정렬 알고리즘을 쓰다 보면 Arrays.sort() 이러한 메소드를 많이 사용할 것이다.

처음에는 단순히 정렬해주는 것으로 알고 있었지만 좀 더 응용하시는 분들이 있기에 신기하기도 하고 좀 더 공부가 필요하다고 생각하여 글을 적어나가기로 했다.

또한 아직 모르시는 분들을 위해서 이번 간단하게 글을 적어나가기로 한다.


이번 글에서 간단하게 Comparator에 대해서 알아보고, Arrays.sort에서는 어떻게 사용된는지 알아볼 것이다.

✏️ Comparator

Comparator는 기본적으로 인터페이스(interface)이다. 이러한 말은 인터페이스 내에 선언된 메소드를 반드시 구현해야한다는 것이다.

만약 구현을 하게 된다면 추상 메소드를 구현해야 하는데, 딱 두 가지가 있다.

  • compare
  • equals

자 이제 정렬을 공부했다면, 한 번쯤은 다들 보셨을 compare이 보일 것이다. 필자는 이 compare 메소드를 좀 더 이해하기를 하고 활용하는 것을 보여주기 위해 글을 썼다고 봐도 무방하다. 하하
(equals는 다들 알고 있을 거라 예상하지만, 값이 같은지를 boolean으로 판별한다.)

그렇다면 compare는 어떻게 생겨 먹었을까??

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);

이런 식으로 바꿔주면 똑같이 판별이 가능하다.

  • a - b 가 음수이면 오른쪽이 크다 위치 안 바꿈
  • a - b 가 양수이면 왼쪽이 크기에 a의 값과 b의 값이 서로 교환된다.
  • a - b 가 0이라면 크기가 서로 같다는 말이 된다.

그렇다면 본격적으로 활용을 하게 된다면 - 필자는 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

profile
내가 공부한 것들을 적는 공간

0개의 댓글