オブジェクトや数値型の値の集合をソートするためのメソッドが、配列を扱うjava.util.Arraysのクラスメソッドsortとして用意されています。Arrays.sortは高速なソートアルゴリズムを実装しており、ソートに用いる順序関係(昇順、降順、辞書順など)はインターフェイスjava.util.Comparatorを実装したクラスで自ら定義することができます。
int型、double型などの数値型のデータをソートしたいときには、以下のように行います。
int[] ia = {10, 5, 30, 20, -18, 0, 50}; // 適当なint型の配列 |
この結果、iaが昇順にソートされます(-18, 0, 5, 10, 20, 30, 50)。iaの中身が書き換えられることに注意してください(sortの戻り値はvoidです)。ソートのアルゴリズムは修正クイックソートが用いられています。クイックソートは最悪の場合(ソート済のデータ)の時間計算量がデータ数nの2乗に比例することが知られていますが、このメソッドではそのような場合にも(n*log n)に比例する時間で実行できる修正がなされています。
単に数値型の配列をソートするのではなく、データをフィールドに持つオブジェクトをソートすることもあります。例えば、String型のフィールドを持つDataクラスを、その文字列長について降順でソートする方法を考えてみます。
import java.util.*; // ArrayListとComparator |
Data.javaでString型のデータを持つクラスを定義します。mainメソッドでは、ArraysListに収めた複数のDataオブジェクトをリスト2で定義しているDataComparatorの定める順序関係に従ってソートしています。Comparatorによって「小さい」と判断されるオブジェクトが前に来るようにソートされます。
public class DataComparator implements java.util.Comparator{ |
DataComparator.javaはインターフェイスjava.util.Comparatorを実装したクラスです。Comparatorで宣言されているメソッドcompareで順序関係を定義します。compareは2つのオブジェクトを引数に取り、最初の引数が「小さい」ときには負の整数を、「等しい」ときには0を、「大きい」ときには正の整数を返すように実装します。
上のプログラム例では「Dataオブジェクトが持つStringオブジェクトについて、文字列長が小さい方が大きい」という順序を定義しています。o1の文字列長が3で、o2の文字列長が5なら、compareの戻り値は2となります。これは正の整数なので、o1の方が大きいということになります。
なお、Comparatorはequalsメソッドも宣言していますが、これはObjectのequalsメソッドによって定義されているため、あえて実装する必要はありません。
Data: Atzy, Data: Kaneko |
実行結果の左列がソート前、右列がソート後を表しています。文字列長の大きいStringを持つDataオブジェクトが前に来るようにソートされたことが分かります。
Copyright © ITmedia, Inc. All Rights Reserved.