log

日記です

Javaで複合ソート 〜 Commons Collections使ってみた 〜

The Java Tips!
きっとお仕事に役立つと思います。
Beanのリストを複合ソートする方法。
一番簡単かつスマートは、以下の方法じゃないかと行き着きました。

★出力結果
千葉 23 おおうらさん 
千葉 23 ひがさん 
千葉 23 ひがしおんなさん 
千葉 23 ひがしさん 
千葉 27 すずきさん 
大阪 16 ふー太郎 
大阪 16 ぷー太郎 
東京 55 ひがしおんなさん 
沖縄 15 がじゃさん 
沖縄 18 ほげ太郎 
沖縄 19 こちんださん 
沖縄 22 すずきさん 
沖縄 43 こちんださん 

ページの最後に記載しているcommonsのjarをビルドパスに追加すれば、コピペでそのまま動くはずです!

そぉ〜っとソート

Hometownを第一、Ageを第二、Nameを第三と階層的にソート。
初めは自前でComparatorを作成して対応していましたが、Apache Commonsを使うのがスマートだと気づきました。見やすいコードのほうがバグも出づらいと思いますし。
SortUtilクラスは本当は適当にファイルを分けるべきですが、一つのファイルにまとめたほうが見やすいと思いまとめています。

実質的なコードは

これだけっすね。

List<HogeBean> beans = createTestData();

// 複合ソート可能なComparator
ComparatorChain comparator = new ComparatorChain();

// 比較するBeanのメンバを指定し、各Comparatorを作成。
// それをComparatorChainに追加。
comparator.addComparator(new BeanComparator("hometown"));
comparator.addComparator(new BeanComparator("age"));
comparator.addComparator(new BeanComparator("name"));

// Java標準のクラスでソート
Collections.sort(beans, comparator);
  • ComparatorChain
  • BeanComparator

が重要なポイントです。

  1. BeanComparatorでBeanのフィールドで比較するComparatorを作成
  2. ComparatorChainにセットし、複合ソートするComparatorを作成
  3. Java標準のjava.util.Collections#sortに、BeanのListと作成したComparatorを渡す
  4. ソート完了

Commonsを使わなかった場合と比べ、Comparatorクラスをとcompareメソッドを実装する手間を省くことができます。

必要なApache Commonsの入手

  • commons-beanutils-1.8.3.jar
  • commons-collections-3.2.1.jar
  • commons-logging-1.1.1.jar

を使っています。
commons-loggingはcommons-beanutilsが内部で使っているようで、、一緒に用意してあげないとClassNotFoundExceptionが出ます。
以下のURLから入手できます。
http://commons.apache.org/collections/download_collections.cgi
http://commons.apache.org/beanutils/download_beanutils.cgi
http://commons.apache.org/logging/download_logging.cgi