코딩 테스트에서 정렬 문제를 자주 접하게 됩니다. 평소에는 Arrays.sort() 이나 Collections.sort()를 활용하여 정렬 문제를 해결하지만, 특정한 정렬 기준(예: 길이순, 내림차순, 복합 정렬 등)을 적용하려면 기본 정렬 방식만으로는 한계가 있다.
이때 Comparator를 활용하면 보다 유연하게 정렬 기준을 적용할 수 있습니다. Comparator를 이용하여 다양한 방식으로 문자열 배열을 정렬하는 방법을 정리해 보려고 한다.
기본적인 문자열 배열 정렬
Arrays.sort()를 활용한 사전순(오름차순)
import java.util.Arrays;
public class StringSortExample {
public static void main(String[] args) {
String[] words = {"banana", "apple", "cherry", "date"};
Arrays.sort(words);
System.out.println(Arrays.toString(words));
}
}
- Arrays.sort(words)를 사용하면 기본적으로 사전순(알파벳순) 정렬이 적용됨.
- 하지만 특정한 기준(예: 길이순, 내림차순)으로 정렬하려면 Comparator를 활용해야 된다.
Comparator를 활용한 정렬
문자열 내림차순 정렬
사전순이 아닌 내림차순(반대로 정렬) 하고 싶다면 Comparator.reverseOrder()를 사용하면 된다.
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] words = {"banana", "apple", "cherry", "date"};
Arrays.sort(words, Comparator.reverseOrder()); // 내림차순 정렬
System.out.println(Arrays.toString(words));
}
}
문자 길이순 정렬
문자열을 길이순으로 정렬하려면 Comparator.comparingInt(String::length)을 사용할 수 있다.
import java.util.Arrays;
import java.util.Comparator;
public class StringLengthSort {
public static void main(String[] args) {
String[] words = {"banana", "apple", "cherry", "date"};
Arrays.sort(words, Comparator.comparingInt(String::length));
System.out.println(Arrays.toString(words));
}
}
문자열 길이 기준 내림차순 정렬
길이를 기준으로 내림차순 정렬하고 싶다면 .reversed()를 활용하면 된다.
Arrays.sort(words, Comparator.comparingInt(String::length).reversed());
복합 정렬 (길이순 정렬 + 알파벳순 정렬)
문자열 길이가 같을 경우 알파벳순(사전순) 정렬을 추가하고 싶다면 .thenComparing(Comparator.naturalOrder())을 활용하면 된다.
Arrays.sort(words, Comparator.comparingInt(String::length)
.thenComparing(Comparator.naturalOrder()));
Comparator 를 직접 구현하기
만약 특정한 기준으로 복잡한 정렬을 해야한다면 Comparator 인터페이스를 직접 구현해도 된다.
import java.util.Arrays;
import java.util.Comparator;
class CustomComparator implements Comparator<String> {
@Override
public int compare(String s1, String s2) {
// 문자열 길이가 긴 순서대로 정렬, 길이가 같다면 알파벳 역순 정렬
if (s1.length() != s2.length()) {
return s2.length() - s1.length(); // 길이 기준 내림차순
}
return s2.compareTo(s1); // 알파벳 역순
}
}
public class Main {
public static void main(String[] args) {
String[] words = {"banana", "apple", "cherry", "date"};
Arrays.sort(words, new CustomComparator());
System.out.println(Arrays.toString(words));
}
}
혹은 익명 클래스를 활용해
import java.util.Arrays;
import java.util.Comparator;
public class Main {
public static void main(String[] args) {
String[] words = {"banana", "apple", "cherry", "date"};
Arrays.sort(words, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
// 문자열 길이가 긴 순서대로 정렬, 길이가 같다면 알파벳 역순 정렬
if (s1.length() != s2.length()) {
return s2.length() - s1.length(); // 길이 기준 내림차순
}
return s2.compareTo(s1); // 알파벳 역순
}
});
System.out.println(Arrays.toString(words));
}
}
이렇게 되면 코드 구조가 더 간결하고, 불필요한 클래스 선언 없이 직접 Comparator를 정의할 수 있다.
정리
정렬방식 | 코드 |
기본 정렬 (사전순 정렬) | Arrays.sort(words) |
내림차순 정렬 | Arrays.sort(words, Comparator.reverseOrder()) |
문자열 길이 기준 정렬 | Arrays.sort(words, Comparator.comparingInt(String::length)) |
문자열 길이 기준 + 내림차 | Arrays.sort(words, Comparator.comparingInt(String::length).reversed()) |
길이 기준 정렬 후, 길이가 같으면 알파벳순 정렬 |
Arrays.sort(words, Comparator.comparingInt(String::length) .thenComparing(Comparator.naturalOrder())) |
체인방식으로 붙이면 됨
'개발일기 > CS(면접)' 카테고리의 다른 글
Fegin Client?? (0) | 2025.03.23 |
---|---|
아키텍쳐 종류 그리고 특징 (0) | 2025.02.24 |
브루트 포스 (Brute Force) 알고리즘이란? (0) | 2025.01.24 |
StringTokenizer 와 split과 차이점 (0) | 2024.12.26 |
Scanner 차이 BufferedReader (0) | 2024.12.18 |