티스토리 뷰

Algorithm/정리

[Java] Comparator 객체와 예제

SdardewValley 2022. 2. 12. 17:00
반응형

  알고리즘 문제를 풀 때 정렬 기준을 따로 세워야 하는 상황이 많다. Java에서 미리 구현된 기준이 아닌 다른 기준으로 정렬하고 싶을 때 Comparable과 Comparator을 사용한다.

 

  Comparable은 인터페이스이다. 정렬 기준을 만들고 싶은 클래스에 implements를 한 다음 public int compareTo 메서드를 구현해 주면 된다. String 타입을 길이 순으로 정렬하고 싶을 때, String 클래스에 Comparable 인터페이스를 사용할 수 없다.

 

  이럴 때 Comparator을 사용하면 된다. 개인적으로 Comparator은 java에 미리 정의되어 있는 자료형에 대한 정렬을 할 때 사용하거나, 2차원 이상의 배열을 정렬할 때 사용한다.

 

  위는 백준 1181번 단어정렬이라는 문제를 예시로 가져왔다. 문자열을 길이 순대로 정렬을 하고, 길이가 같으면 사전순으로 정렬하라고 한다. 기본적으로 문자열 정렬은 사전 순으로 정렬을 한다. 1의 조건 때문에 Comparator을 사용했다. 그리고 같은 단어는 한 번만 출력을 해야 하기 때문에 정렬도 되고 중복된 값은 한 번만 저장되는 TreeSet을 선택했다.

 

import java.io.*;
import java.util.Comparator;
import java.util.TreeSet;

public class Main {
    static private final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    public static void main(String[] args) throws IOException {
        int N = Integer.parseInt(br.readLine());
        TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                if(o1.length() == o2.length()) {
                    return o1.compareTo(o2);
                }
                return o1.length() - o2.length();
            }
        });

        for (int i = 0; i < N; i++) {
            set.add(br.readLine());
        }

        for (String s : set) {
            System.out.println(s);
        }
        br.close();
    }
}

  자료구조 생성할 때 Comparator 객체를 생성하여 넣어준다. Comparator 객체는 안에 public int compare이라는 함수를 선언해 주어야 한다.

 

  위의 코드는 0번째 값을 기준으로 정렬하고 같다면 1번째 값을 기준으로 2차원 배열을 정렬하는 코드이다. Arrays.sort 안에 Comparator을 정의하여 2차원 배열을 정렬해 줄수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
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
글 보관함