2012年1月29日日曜日

Android:ArrayListをソートする

データを格納したArrayListを使ってList表示などよくやる方法です。
一つのデータをソートするより、複数条件でソートしたい場合どうすればいいのかメモです。
Collections.sort()を使ってソートします。
ソート条件はComparatorインターフェースの実装クラスで定義します。大小関係でソートされますが、同値の場合ソートされません。同値の時に次の要素でソートする事で複数条件でのソートを実現します。

例としてデータクラスに格納されているorderで比較し昇順にソートし、orderが同じならpointで比較します。

▽データ保持用クラス(Data.java)

public class Data {

    private String name;
    private int order;
    private int point;

    public Data(String name, int order, int point){
        this.name = name;
        this.order = order;
        this.point = point;
    }

    public String getName(){
        return this.name;
    }

    public int getOrder(){
        return this.order;
    }

    public int getPoint(){
        return this.point;
    }
}

▽ソート

 public void arrayTest(){
        ArrayList dataList = new ArrayList();

        dataList.add(new Data("data1", 5, 5));
        dataList.add(new Data("data2", 1, 6));
        dataList.add(new Data("data3", 1, 1));
        dataList.add(new Data("data4", 6, 2));
        dataList.add(new Data("data5", 1, 2));
        dataList.add(new Data("data6", 3, 6));

        for(int i=0; i(){

            @Override
            public int compare(Data lhs, Data rhs) {
                if((lhs.getOrder() - rhs.getOrder()) == 0){
                    return lhs.getPoint() - rhs.getPoint();
                }
                return lhs.getOrder() - rhs.getOrder();
            }

        });

        for(int i=0; i



ソート前:当然入れた通りに格納されています。



data1 / 5 / 5

data2 / 1 / 6

data3 / 1 / 1

data4 / 6 / 2

data5 / 1 / 2

data6 / 3 / 6



ソート後:orderが同値のものはpoint順でソートされます。



data3 / 1 / 1

data5 / 1 / 2

data2 / 1 / 6

data6 / 3 / 6

data1 / 5 / 5

data4 / 6 / 2

0 件のコメント:

コメントを投稿