2008年10月9日木曜日

java.util.Comparatorを使用してオブジェクトをソートする

Javaで加工したデータ(POJOクラスのListなど)を、最後に特定項目順(複数)でソートしたい場合についてのメモ。

java.util.Comparatorを実装したクラスを作り、
 配列ならArrays.sort()
 List等のコレクションならCollections.sort()
を用いてソートする。

java.util.Comparatorの実装のやり方で、複数項目の降順、昇順にも対応できる。

以下、サンプルプログラム。

■ソート対象オブジェクト
public class Parameter {
  private String code1;
  private String code2;
  private String code3;

//(以下、Getter/Setter)
}

■テストComparatorクラス(code1、code2、code3の順でソート)
public class TestComparator implements Comparator<Parameter> {
  public int compare(Parameter o1, Parameter o2) {
    String code1_1 = o1.getCode1();
    String code1_2 = o2.getCode1();
    // code1.compareTo(code2);の順序を逆にすると昇順、降順を制御できる
    int value = code1_1.compareTo(code1_2);
    if (value == 0) {
      // 第一ソート項目が同じなら第二ソート項目を比べる
      String code2_1 = o1.getCode2();
      String code2_2 = o2.getCode2();
      value = code2_1.compareTo(code2_2);
      if (value == 0) {
        // 第二ソート項目も同じなら第三ソート項目も比べる
        String code3_1 = o1.getCode3();
        String code3_2 = o2.getCode3();
        value = code3_1.compareTo(code3_2);
      }
    }
    return value;
  }
}

■実行
// ソート対象のParameterクラスのリスト
List<Parameter> paramList = new ArrayList<Parameter>();

//(任意の値のcode1、code2、code3を設定したParameterを作成し、paramListに加える)

// paramListに対してソート
Collections.sort(paramList, new TestComparator());

// ソート結果の確認
for (Parameter param : paramList) {
  System.out.println(param.getCode1() + "," + param.getCode2() + "," + param.getCode3());
}

0 件のコメント: