DTOのソート


んな場合かというのは色々だろうけど、実際に使用したのでメモしておこう。


配列のソートというだけならば話は簡単なのだが、DTOのListをソートしたい場合の話。
これはjava.util.Collections*1を使うことで、DTOの任意の値でもってソートできる。


DTOの定義

public class Value {

  Value(String str1,String str2){
    setStr1(str1);
    setStr2(str2);
  } 
  
  String str1;
  String str2;
  
  public String getStr1() {
    return str1;
  }
  public void setStr1(String str1) {
    this.str1 = str1;
  }
  public String getStr2() {
    return str2;
  }
  public void setStr2(String str2) {
    this.str2 = str2;
  }
}

実行クラス

public class test {

    public static void main(String[] args) {
      Value v1 = new Value("AAA", "999");
      Value v2 = new Value("BBB", "000");
      Value v3 = new Value("CCC", "555");
      
      List<Value> values = new ArrayList<Value>();
      values.add(v1);
      values.add(v2);
      values.add(v3);

      //str1でソート
      Collections.sort(values,new Comparator<Value>(){
        public int compare(Value obj1, Value obj2) {
          return (obj1.getStr1()).compareTo(obj2.getStr1());
        }
      });
      
      print(values);
      
      //str1でソート
      Collections.sort(values,new Comparator<Value>(){
        public int compare(Value obj1, Value obj2) {
          return (obj2.getStr1()).compareTo(obj1.getStr1());
        }
      });
      
      print(values);

      //str2でソート
      Collections.sort(values,new Comparator<Value>(){
        public int compare(Value obj1, Value obj2) {
          return (obj1.getStr2()).compareTo(obj2.getStr2());
        }
      });
      
      print(values);
      
      //str2でソート
      Collections.sort(values,new Comparator<Value>(){
        public int compare(Value obj1, Value obj2) {
          return (obj2.getStr2()).compareTo(obj1.getStr2());
        }
      });
      
      print(values);
    }
    
    private static void print(List<Value> values){
      System.out.println("----------------------");
      for(Value v : values){
        System.out.println(v.getStr1()+","+v.getStr2());
      }
      System.out.println("----------------------");
    }

}


実行結果

----------------------
AAA,999
BBB,000
CCC,555
----------------------
----------------------
CCC,555
BBB,000
AAA,999
----------------------
----------------------
BBB,000
CCC,555
AAA,999
----------------------
----------------------
AAA,999
CCC,555
BBB,000
----------------------


とまぁ昇順・降順も任意に制御できるということらしい。
java.util.Collectionsには他にもいろいろと便利な機能がありそうだ*2