Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java에서 배열 요소를 사전순(Lexicographical Order)으로 정렬하는 방법

이 글에서는 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() 메서드를 활용하는 것도 좋은 대안이 됩니다.