導入
Javaで文字列やリストを扱う際、「辞書順(アルファベット順)」で並べ替えたり比較したりしたい場面は非常に多いです。しかし、数値の比較と異なり、文字列は「文字コードの並び」に基づいているため、直感と少し異なる動作をすることがあります。本記事では、この辞書順比較の仕組みを理解し、現場で安全に実装する方法を解説します。
基礎知識
辞書順(Lexicographical order)とは、辞書で単語を引くときのように、先頭の文字から順に比較していく方法です。
具体的には、Javaの文字列比較では「Unicode(文字コード)」の値が小さい順に並べられます。
例えば、「Apple」と「Banana」を比較する場合、最初の文字 ‘A’(Unicode 65)と ‘B’(Unicode 66)を比べ、’A’の方が小さいため、「Apple」の方が辞書順で先であると判定されます。
これをJavaで実装する場合、主に Comparable インターフェースや Comparator インターフェースを利用します。
実装/解決策
Javaで辞書順比較を行うには、主に以下の手法を使います。
1. Stringクラスの compareTo() メソッド:自身と引数を比較し、辞書順で前なら負の数、同じなら0、後ろなら正の数を返します。
2. Comparator.naturalOrder():リストの並び替えなどで利用する、標準的な辞書順定義です。
また、比較時に「大文字と小文字を区別しない」という要件もよくあります。その場合は String.CASE_INSENSITIVE_ORDER を使用するのが定石です。
サンプルプログラム
以下のコードは、文字列のリストを辞書順でソートし、比較する方法を示したものです。そのままコピーして実行してみてください。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class LexicographicalExample {
public static void main(String[] args) {
List fruits = new ArrayList<>();
fruits.add("Banana");
fruits.add("apple");
fruits.add("Cherry");
// 1. 通常の辞書順でソート(大文字が先にくる)
Collections.sort(fruits);
System.out.println("標準ソート結果: " + fruits);
// 2. 大文字小文字を区別しない辞書順比較
fruits.sort(String.CASE_INSENSITIVE_ORDER);
System.out.println("大文字小文字無視の結果: " + fruits);
// 3. compareToを使った直接比較
String s1 = "Apple";
String s2 = "Banana";
int result = s1.compareTo(s2);
if (result < 0) {
System.out.println(s1 + " は " + s2 + " より辞書順で前です。");
}
}
}
応用・注意点
現場で辞書順比較を行う際、特に注意すべきは「ロケール(地域設定)」です。
例えば、日本語の五十音順と、Unicodeの並び順は必ずしも一致しません。もし厳密な日本語の並び替えが必要な場合は、Collator クラスを使用してください。
また、比較演算子(==)を文字列に使ってはいけません。==は「メモリ上の同じインスタンスか」を判定するもので、内容の比較にはなりません。必ず equals() や compareTo() を使用しましょう。
さらに、最近のJava(Java 16以降)では instanceof パターンマッチング を使うことで、比較対象が文字列かどうかを安全に判定しつつ、キャストを省略して比較処理へ進むことができます。
Object obj = "Test";
if (obj instanceof String str) {
// キャスト不要で安全に辞書順比較が可能
System.out.println(str.compareTo("Apple"));
}
これらを活用して、バグのない堅牢な比較処理を実装してください。

コメント