2011年4月14日木曜日

Java Listのソート

今回は、AndroidというよりはJavaでListをSortの話。サンプルはAndroidのリストビューをソートして表示させる。

sortには下記Collections.sortを使う。
Collections.sort(List<T> list, Comparator<? super T> c)
第二引数はソートをカスタマイズしたいときに独自にコンパレータを実装してやる。なくても良い。
コンパレータはcompareメソッドを実装する。
public int compare(Object arg0, Object arg1) {  
    return 1;    //正の整数:arg0が大きい 0:等しい 負の整数:arg0が小さい  
}  

Listのsortに関してはこれだけ知ってれば十分。と、思う。


サンプルはまた「ListView positionによってViewを変える 」で使用した小説のリストを使用してandroidで行う。著者は外して小説のみとする。

小説を価格でソートするためのクラスを用意。
    public class NovelComparator implements Comparator {
        private int n;

        public NovelComparator() {
            n = 1;
        }

        public NovelComparator(String sort) {
            if (sort.equals("desc")) {
                n = -1;
            } else {
                n = 1;
            }
        }

        @Override
        public int compare(Object arg0, Object arg1) {
            Novel novel0 = (Novel) arg0;
            Novel novel1 = (Novel) arg1;
            if (novel0.getPrice() > novel1.getPrice()) {
                return 1 * n;
            } else if (novel0.getPrice() == novel1.getPrice()) {
                return 0;
            } else {
                return -1 * n;
            }
        }
    }

あとはイベント時に下記methodでソートを行い、ListViewにadapterをセットし直すだけ。簡単簡単。
    private void sort(String sort) {
        Collections.sort(novels, new NovelComparator(sort));
        adapter = new NovelAdapter(this, novels);
        setListAdapter(adapter);
    }