Java
 Computer >> コンピューター >  >> プログラミング >> Java

Javaで配列の要素を辞書式順序(辞書順)にソートする方法

この記事では、Javaで配列の要素を辞書式順序(レキシコグラフィカル順)にソートする方法について解説します。辞書式順序とは、国語辞典などで使われるアルファベット順・五十音順の考え方を、文字列やシーケンス全般に一般化したものです。

まず、今回作成するプログラムの入力と出力のイメージを確認しておきましょう。

入出力の例

入力

今回は次のような文字列配列を扱います。

Alpha Beta Gamma Delta

出力

辞書式順序にソートすると、次のようになります。

Alpha Beta Delta Gamma

アルゴリズム

ソートの流れは以下の通りです。

  1. 処理を開始する
  2. 整数型変数 i、j、array_length を宣言する
  3. 文字列型の配列を宣言する
  4. 配列の長さ(array_length)を定義する(またはユーザーに入力してもらう)
  5. 文字列配列の各要素を定義する(またはユーザーに入力してもらう)
  6. 二重のforループを使い、compareToメソッドの比較結果に応じて要素を入れ替え(スワップ)ながら並べ替える
  7. 結果を表示する
  8. 処理を終了する

例1:compareToメソッドを使った基本的なソート

最初の例では、StringクラスのcompareTo()メソッドを使用します。compareTo()は2つの文字列を辞書式に比較し、呼び出し元の文字列が引数より小さい場合は負の値、等しい場合は0、大きい場合は正の値を返します。この性質を利用して、隣接する要素同士を比較し、順序が逆なら入れ替えていくことでソートを実現しています。

public class Main {
   public static void main(String[] args) {
      String[] myInput = { "Alpha", "Beta", "Gamma", "Delta" };
      int i, j, arrayLength;
      arrayLength = 4;
      System.out.println("文字列の配列は次のように定義されています");
      for(i = 0; i < arrayLength; i++) {
         System.out.println(myInput[i]);
      }
      for(i = 0; i < arrayLength - 1; ++i) {
         for (j = i + 1; j < arrayLength; ++j) {
            if (myInput[i].compareTo(myInput[j]) > 0) {
               String temp = myInput[i];
               myInput[i] = myInput[j];
               myInput[j] = temp;
            }
         }
      }
      System.out.println("辞書式順序に並べ替えた結果:");
      for(i = 0; i < 4; i++) {
         System.out.println(myInput[i]);
      }
   }
}

出力

文字列の配列は次のように定義されています
Alpha
Beta
Gamma
Delta
辞書式順序に並べ替えた結果:
Alpha
Beta
Delta
Gamma

例2:大文字小文字を区別せずにソートする(compareToIgnoreCase)

次に、compareToIgnoreCase()メソッドを使った例を紹介します。このメソッドは大文字と小文字の違いを無視して比較を行うため、「Apple」と「apple」を同一の文字列として扱いたい場合に便利です。ソート処理と表示処理をそれぞれ独立したメソッドに分けて実装しています。

import java.io.*;

public class LexicographicalOrder {
   public static void sortData(String[] myArray){
      for (int i = 0; i < myArray.length; i++) {
         for (int j = i + 1; j < myArray.length; j++) {
            if (myArray[i].compareToIgnoreCase(myArray[j]) > 0) {
               String temp = myArray[i];
               myArray[i] = myArray[j];
               myArray[j] = temp;
            }
         }
      }
   }

   public static void printData(String[] myArray){
      for (String str : myArray)
         System.out.print(str + " ");
      System.out.println();
   }

   public static void main(String[] args){
      String[] myArray = { "Alpha", "Beta", "Gamma", "Delta" };
      System.out.println("必要なパッケージがインポートされました");
      System.out.println("辞書式順序にソートした結果:");
      sortData(myArray);
      printData(myArray);
   }
}

出力

必要なパッケージがインポートされました
辞書式順序にソートした結果:
Alpha Beta Delta Gamma

補足:計算量とArrays.sort()の活用

上記のような自前の実装は交換ソート(隣接要素の比較と入れ替えを繰り返す方式)であり、時間計算量はO(n²)となります。そのため、要素数が多いデータや実務のコードでは、標準ライブラリのArrays.sort()メソッドを使うのがおすすめです。Arrays.sort()はO(n log n)の効率的なアルゴリズムで、文字列配列もデフォルトで辞書式順序にソートできます。

import java.util.Arrays;

public class Main {
   public static void main(String[] args) {
      String[] myArray = { "Alpha", "Beta", "Gamma", "Delta" };
      Arrays.sort(myArray);
      System.out.println(Arrays.toString(myArray));
   }
}

実行結果:

[Alpha, Beta, Delta, Gamma]

まとめ

Javaで文字列配列を辞書式順序にソートするには、compareTo()またはcompareToIgnoreCase()メソッドで文字列を比較し、条件に応じて要素を入れ替えるのが基本です。学習目的で自前のソートを実装するのは良い練習になりますが、実務ではArrays.sort()などの標準APIを活用することで、簡潔かつ高速に処理できます。

  1. Javaでカウンティングソート(計数ソート)を実装するプログラム

    カウンティングソート(Counting Sort:計数ソート)は、異なるキー値を持つ要素がそれぞれいくつ存在するかを数え上げることで、整列を行うソートアルゴリズムです。比較ベースのソートとは異なり、要素同士を直接比較せずに出現回数を集計して並べ替えるため、値の範囲が限られているデータに対して高速に動作します。注意: 以下のコードは、負の数を含む配列にも対応しています。サンプルコードimport java.util.*; public class Demo{ static void count_sort(int[] arr){ int max_val = Arrays.s

  2. カクテルソートとは?Javaでの実装方法と動作原理をわかりやすく解説

    カクテルソート(Cocktail Sort)は、バブルソートを改良した整列アルゴリズムの一つで、「双方向バブルソート」や「シェーカーソート」とも呼ばれます。通常のバブルソートでは、要素を左から右への一方向にのみ走査し、大きい値から順に配列の末尾へ確定させていきます。一方、カクテルソートでは左から右、右から左へと交互に双方向の走査を行う点が大きな特徴です。これにより、配列の末尾側だけでなく先頭側にも素早く整列済みの領域が形成され、バブルソートよりも効率が向上する場合があります。カクテルソートのJavaプログラム例以下は、カクテルソートをJavaで実装したサンプルプログラムです。public cl