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());
}

HTMLの1つのForm内の複数ボタンを判別するには?

HTMLの一つのForm内で、複数ボタンのどれが押されたかを判別する方法について。
以前調べる機会があったのでメモ書き。

■方法1 type="submit"の場合
type="submit"の場合、name・valueはサーバ側に送られるので、それを使って区別できる。

・HTML側
<form action="xxx">
<input type="submit" name="Next" value="次へ">
<input type="submit" name="Back" value="戻る">
</form>

・Servlet側
if (req.getParameter("Next") != null) {
  // 「次へ」処理
} else if (req.getParameter("Back") != null) {
  // 「戻る」処理
}

といった感じで、押されたボタンを区別できる。


■方法2 type="button"の場合
type="button"の場合、nameもvalueもサーバ側に送られない。
そのためJavaScriptを使う。
hidden属性のオブジェクトを用意し、ボタン押下時にJavaScriptで「ボタンの名前をオブジェクトにセットし、submit()」という方法がある。
受取側はオブジェクトにセットされている値でボタンを区別できる。

・HTML側
<script type="text/javascript">
<!--
function goSubmit(formObj, btnObj) {
  formObj.action.value=btnObj.name;
  formObj.submit();
}
// -->
</script>

<form action="xxx">
<input type="hidden" name="action">
<input type="button" onClick="goSubmit(this.form, this)" name="Next" value="次へ">
<input type="button" onClick="goSubmit(this.form, this)" name="Back" value="戻る">
</form>

・Servlet側
if ("Next".equals(req.getParameter("action"))) {
  // 「次へ」処理
} else if ("Back".equals(req.getParameter("action"))) {
  // 「戻る」処理
}

といった感じで、JavaScriptで設定したactionの値で区別できる。
なお携帯向けサイトではJavaScriptが動作しない機種があるため、方法1を使ったほうが良い。