プログラムのなかでデータを特定の条件でソートして使いたい場合があります。今回のTipsは,コレクションフレームワークのjava.util.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.