이 글에서는 Java에서 배열의 요소를 사전순(lexicographical order)으로 정렬하는 방법을 자세히 살펴봅니다. 사전순 정렬은 사전에 단어가 배열되는 알파벳 순서를 문자열 시퀀스로 확장한 개념으로, 첫 글자부터 차례대로 비교하여 순서를 결정합니다.
사전순 정렬의 기본 원리
Java에서 두 문자열의 대소를 비교할 때는 compareTo() 메서드를 사용합니다. 이 메서드는 두 문자열을 앞 글자부터 하나씩 비교하여, 호출한 문자열이 사전순으로 앞서면 음수, 같으면 0, 뒤처지면 양수를 반환합니다. 대소문자를 구분하지 않고 비교하려면 compareToIgnoreCase() 메서드를 사용하면 됩니다.
아래는 사전순 정렬의 간단한 예시입니다 −
입력
입력값이 다음과 같다고 가정해 보겠습니다 −
Alpha Beta Gamma Delta
출력
원하는 출력 결과는 다음과 같습니다 −
Alpha Beta Delta Gamma
알고리즘
1단계 - 시작 2단계 - 정수형 변수 i, j, array_length를 선언한다 3단계 - 문자열 배열을 선언한다 4단계 - 사용자에게 array_length 값을 입력받거나 직접 정의한다 5단계 - 사용자에게 문자열 배열의 단어를 입력받거나 배열을 직접 정의한다 6단계 - 값을 읽어들인다 7단계 - for 루프를 돌며 swap(교환) 방식으로 compareTo 함수를 사용해 단어를 정렬하고 값을 저장한다 8단계 - 결과를 출력한다 9단계 - 종료
예제 1: compareTo()로 사전순 정렬하기
첫 번째 예제는 중첩 for 루프와 compareTo() 메서드를 활용합니다. 배열의 모든 요소 쌍을 비교한 뒤, 앞쪽 요소가 뒤쪽 요소보다 사전순으로 늦으면 두 요소의 위치를 서로 교환(swap)하는 선택 정렬 방식입니다.
public class Main {
public static void main(String[] args) {
String[] my_input = { "Alpha", "Beta", "Gamma", "Delta" };
int i, j, array_length;
array_length = 4;
System.out.println("The array of string is defined as ");
for(i = 0; i < array_length; i++) {
System.out.println(my_input[i]);
}
for(i = 0; i < array_length - 1; ++i) {
for (j = i + 1; j < array_length; ++j) {
if (my_input[i].compareTo(my_input[j]) > 0) {
String temp = my_input[i];
my_input[i] = my_input[j];
my_input[j] = temp;
}
}
}
System.out.println("The words in lexicographical order is:");
for(i = 0; i < 4; i++) {
System.out.println(my_input[i]);
}
}
}출력
The array of string is defined as Alpha Beta Gamma Delta The words in lexicographical order is: Alpha Beta Delta Gamma
예제 2: 메서드 분리와 compareToIgnoreCase() 활용
두 번째 예제는 정렬 로직을 sortData(), 출력 로직을 printData() 메서드로 분리하여 코드 가독성과 재사용성을 높였습니다. 특히 compareToIgnoreCase()를 사용하므로 대소문자가 섞여 있는 문자열도 일관된 기준으로 정렬할 수 있다는 장점이 있습니다.
import java.io.*;
public class LexicographicalOrder {
public static void
sortData(String my_array[]){
for (int i = 0; i < my_array.length; i++) {
for (int j = i + 1; j < my_array.length; j++) {
if (my_array[i].compareToIgnoreCase(my_array[j]) > 0) {
String my_temp = my_array[i];
my_array[i] = my_array[j];
my_array[j] = my_temp;
}
}
}
}
public static void printData(String my_array[]){
for (String my_string : my_array)
System.out.print(my_string + " ");
System.out.println();
}
public static void main(String[] args){
String my_array[] = { "Alpha", "Beta", "Gamma", "Delta" };
System.out.println("Required packages have been imported");
System.out.println("The Lexicographical Order data is");
sortData(my_array);
printData(my_array);
}
}출력
Required packages have been imported The Lexicographical Order data is Alpha Beta Delta Gamma
마무리
이처럼 Java에서는 compareTo() 계열 메서드와 간단한 선택 정렬 방식의 루프만으로도 문자열 배열을 손쉽게 사전순으로 정렬할 수 있습니다. 다룰 데이터가 많거나 성능이 중요한 환경이라면 표준 라이브러리의 Arrays.sort() 메서드를 활용하는 것도 좋은 대안이 됩니다.