T_era

[JAVA] Comparator 구현하기 본문

Programing/Java

[JAVA] Comparator 구현하기

블스뜸 2025. 3. 29. 15:04

백준 1181번 문제를 풀기위해 Comparator를 알아보았다

Comparator
- 두 매개변수를 비교하기 위한 인터페이스
- 인터페이스이기 때문에 직접 재정의를 해주어 사용해야한다.

@FunctionalInterface
public interface Comparator<T> {
	int compare(T o1, T o2);
}

해당 인터페이스는 이렇게 선언되어 있다.
o1과 o2를 비교하여 정수형을 리턴하는 형태
문제를 풀기위해 구현한 익명메소드

 

Arrays.sort(words, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                if (s1.length() != s2.length()) {
                    return s1.length() - s2.length();
                } else {
                    return s1.compareTo(s2);
                }
            }
        });

Arrays.sort()는 정렬을 위한 메소드인데 words를 compare한 기준으로 정렬해준다
이렇게 선언하게 되면 compare 결과가 양수일 경우 두 값의 자리를 바꿔준다

내가 구현한 방식은 문자열을 정렬하기 위해서 문자열 길이가 다를 경우 짧은 순으로 정렬을 하고
문자열 길이가 같을 경우 compareTo를 통해 문자열의 내용을 비교하여 정렬을 한다

compareTo의 경우도 두 문자열을 비교하여 s1이 유니코드상 크기가 더 큰 경우 양수를 반환한다

전체 코드

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;

// 백준 1181 : 단어정렬
public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        HashSet<String> word = new HashSet<>();
        ArrayList<String> temp = new ArrayList<>();

        int count = Integer.parseInt(br.readLine());

        // HashSet을 이용해 입력과 동시에 중복 삭제
        for (int i = 0; i < count; i++){
            String str = br.readLine();
            if(word.add(str)){
                temp.add(str);
            }
        }
        String[] words = temp.toArray(new String[0]);

        // Comparator를 이용해 문자열 길이를 비교했을 때 s2가 s1보다 짧으면 양수를 반환 = Sort를 통해 자리를 바꿈
        // 하지만 길이가 같으면 compareTo <- 유니코드를 통해 문자하나하나의 우선순위를 비교 s2가 더 작은 문자열이면 양수를 반환 = Sort를 통해 자리를 바꿈
        Arrays.sort(words, new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                if (s1.length() != s2.length()) {
                    return s1.length() - s2.length();
                } else {
                    return s1.compareTo(s2);
                }
            }
        });
        for (String s : words) {
            bw.write(s);
            bw.newLine();
        }

        bw.flush();
        bw.close();
        br.close();
    }
}

 

'Programing > Java' 카테고리의 다른 글

[JAVA] 병합정렬 구현하기  (0) 2025.04.02
[JAVA] 퀵정렬 알고리즘 구현하기  (0) 2025.04.02
[JAVA] HashSet이란???  (0) 2025.03.28
[JAVA] 스코프와 형변환  (0) 2025.03.28
[JAVA] 반복문  (0) 2025.03.28