Java Tips:テキストをソートするにはJAVA Developer

プログラムのなかでデータを特定の条件でソートして使いたい場合があります。今回のTipsは,コレクションフレームワークのjava.util.TreeSetクラスを使った簡単なソート機能を紹介します。

» 2004年07月08日 09時06分 公開
[JAVA Developer]

TreeSetクラスを使ったソート

 コレクションフレームワークは,複数個のデータをまとめて扱うときに便利なデータ構造を持つインタフェースと,それを実装したクラスで構成されています。ここで紹介するjava.util.TreeSetクラスは,要素に順序を持った集合を実装したクラスです。まずは,基本的な使い方として,テキストファイルを1行ずつ読み込み,各行をソートして表示してみます。

リスト1 TreeSetでソート(抜粋)

java.io.InputStreamReader isr = new java.io.InputStreamReader(
    new java.io.FileInputStream("sample.txt"), "Windows-31J");
java.io.BufferedReader br = new java.io.BufferedReader(isr);
 
java.util.TreeSet set = new java.util.TreeSet();
String buff;
while ((buff = br.readLine()) != null) {
    set.add(buff);
}
br.close();
isr.close();
 
java.util.Iterator ite = set.iterator();
while (ite.hasNext()) {
    buff = (String)ite.next();
    System.out.println(buff.getBuff());
}

 このソースでは,TreeSetクラスのインスタンスを作成し,addメソッドで読み込んだ各行の文字列を追加。すべて追加したら,ソートした結果を表示するためにIteratorインタフェースを使って要素を順番に取得し,表示しています。このソースでは,ソート処理を一切記述していません。

 次のようなテストデータを用意しました。

sample.txt

grape
apple
orange
peach
banana

 リスト1を実行すると,

apple
banana
grape
orange
peach

と表示され,テキストファイルの内容が昇順にソートされていることがわかります。これは,TreeSetクラスが標準で「自然順序付け」に昇順ソートする機能を備えているためです。

 独自のソートを実現する場合は,TreeSetクラスのインスタンスを作成する際に,コンパレータクラスを指定します。コンパレータクラスは,java.util.Comparatorインタフェースをインプリメントしてユーザーが実装するクラスで,ソートの順番を決めるためのcompareメソッドを定義します。ソート順を降順に変えるコンパレータクラスは,リスト2のように定義します。

リスト2 コンパレータクラス

public class MyComp implements java.util.Comparator {
    public int compare(Object o1, Object o2) {
        String s1 = (String)o1;
        return si.compareTo(o2)*-1;
    }
}

 リスト1の変更は,次に示す1行だけです。TreeSetのコンストラクタに,パラメータとしてコンパレータクラスMyCompのインスタンスを渡すだけです。

java.util.TreeSet set = new java.util.TreeSet(new MyComp());

 これを実行すると次のように降順に表示されます。

peach
orange
grape
banana
apple

 このように独自のソートルールは,簡単に設定できます。

 TreeSetクラスを利用するうえで注意するポイントは,重複したデータを登録できないということです。これは,TreeSetクラスの基となっているSetインタフェースの制限事項になります。もし,対象となるテキストが重複する可能性がある場合は,シリアル番号のような一意のデータを持つようにし,コンパレータクラスのcompareメソッドでテキストが一致する場合には一意のデータを利用して0が帰らないようにするとよいでしょう。

 「JAVA Developer」より毎週役立つJava Tipsを配信中。ほかにも参考になるTipsは、JAVA Developerサイトのバックナンバーから探すことが可能です。

Copyright(C) 2010 SOFTBANK Creative Inc. All Right Reserved.

注目のテーマ