Listの独自キーでのソート

java.util.Comparatorインターフェースで評価を実装し、java.utilCollections.sort()メソッドでソートする。
Comparator#compare()の仕様を見て頂くのが一番判りやすいと思う。


int compare(T o1, T o2)
パラメータ:
o1 - 比較対象の最初のオブジェクト
o2 - 比較対象の 2 番目のオブジェクト
戻り値:
最初の引数が 2 番目の引数より小さい場合は負の整数、両方が等しい場合は 0、
最初の引数が 2 番目の引数より大きい場合は正の整数
つまり、二つの対象を評価して、前に並べたければ、-1を、後ろなら1を、同じなら0を返せということ。

以下、簡単なサンプル。
String型のIDの文字列長でソートしてみた。nullの場合は前にくるようにした。
データのクラス


public class TestData
{
private final String id;
public TestData(String id)
{
this.id = id;
}
public String getId()
{
return this.id;
}
}
データ生成、ソート、出力をする。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortTest
{
public static void main(String[] args)
{
//データの生成
List list = new ArrayList();
list.add(new TestData("talisker"));
list.add(new TestData("lagavulin"));
list.add(new TestData(null));
list.add(new TestData("ardbeg"));
list.add(new TestData("oban"));
list.add(new TestData("bowmore"));
list.add(new TestData(""));
list.add(new TestData("yoichi"));
list.add(new TestData(null));
list.add(new TestData("kingsbury"));
list.add(new TestData("macallan"));
list.add(new TestData("balvenie"));

//java.util.Comparatorインターフェースを実装する。
Collections.sort(list, new Comparator(){
@Override
public int compare(TestData first, TestData second){
//null評価
//両方nullなら等価とする
if(first.getId() == null && second.getId() == null){
return 0;
}
//片方nullなら、nullを小さいとする。
if(first.getId() == null){
return -1;
}else if(second.getId() == null){
return 1;
}

//idの文字列長でソート。文字列数がが小さい順に並べる。
if(first.getId().length() > second.getId().length()){
return 1;
}else if(first.getId().length() < second.getId().length()){
return -1;
}else if(first.getId().length() == second.getId().length()){
return 0;
}
return 0;
}
});
//出力
for(TestData testData: list){
System.out.println(testData.getId());
}
}
}

出力結果

null
null

oban
ardbeg
yoichi
bowmore
talisker
macallan
balvenie
lagavulin
kingsbury

超簡単!