検索
連載

オブジェクトを手軽にソートするJavaTips 〜Javaプログラミング編

Share
Tweet
LINE
Hatena

 オブジェクトや数値型の値の集合をソートするためのメソッドが、配列を扱うjava.util.Arraysのクラスメソッドsortとして用意されています。Arrays.sortは高速なソートアルゴリズムを実装しており、ソートに用いる順序関係(昇順、降順、辞書順など)はインターフェイスjava.util.Comparatorを実装したクラスで自ら定義することができます。

数値の配列をソートする

 int型、double型などの数値型のデータをソートしたいときには、以下のように行います。

int型配列のソート

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


 この結果、iaが昇順にソートされます(-18, 0, 5, 10, 20, 30, 50)。iaの中身が書き換えられることに注意してください(sortの戻り値はvoidです)。ソートのアルゴリズムは修正クイックソートが用いられています。クイックソートは最悪の場合(ソート済のデータ)の時間計算量がデータ数nの2乗に比例することが知られていますが、このメソッドではそのような場合にも(n*log n)に比例する時間で実行できる修正がなされています。

オブジェクトをソートする

 単に数値型の配列をソートするのではなく、データをフィールドに持つオブジェクトをソートすることもあります。例えば、String型のフィールドを持つDataクラスを、その文字列長について降順でソートする方法を考えてみます。

リスト1 Data.java

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


 Data.javaでString型のデータを持つクラスを定義します。mainメソッドでは、ArraysListに収めた複数のDataオブジェクトをリスト2で定義しているDataComparatorの定める順序関係に従ってソートしています。Comparatorによって「小さい」と判断されるオブジェクトが前に来るようにソートされます。

リスト2 DataComparator.java

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


 DataComparator.javaはインターフェイスjava.util.Comparatorを実装したクラスです。Comparatorで宣言されているメソッドcompareで順序関係を定義します。compareは2つのオブジェクトを引数に取り、最初の引数が「小さい」ときには負の整数を、「等しい」ときには0を、「大きい」ときには正の整数を返すように実装します。

 上のプログラム例では「Dataオブジェクトが持つStringオブジェクトについて、文字列長が小さい方が大きい」という順序を定義しています。o1の文字列長が3で、o2の文字列長が5なら、compareの戻り値は2となります。これは正の整数なので、o1の方が大きいということになります。

 なお、Comparatorはequalsメソッドも宣言していますが、これはObjectのequalsメソッドによって定義されているため、あえて実装する必要はありません。

実行結果

*** 一部省略されたコンテンツがあります。PC版でご覧ください。 ***


 実行結果の左列がソート前、右列がソート後を表しています。文字列長の大きいStringを持つDataオブジェクトが前に来るようにソートされたことが分かります。

Profile

WINGSプロジェクト

小田原大


Copyright © ITmedia, Inc. All Rights Reserved.

ページトップに戻る