このエントリーをはてなブックマークに追加


独自クラスでキー指定のソートサンプル

独自クラスにメンバー変数があり、処理によりソートするキー(メンバ変数)を指定したい場合の
サンプルソースを以下に記します。
ソートする方法は1つでいいのだ!と言う場合は、以下の記事を参照してください。

関連記事

独自クラスでメンバ変数を指定でソートするサンプルソース

以下のサンプルソースでは、OperationSystemというクラスを作り、これをArrayListにaddし、
ソートするサンプルソースとなっています。
ソートするキー(メンバ変数)は、productName, marketShareの両方をサポートしています。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

class OperationSystem {
    String  productName;
    double  marketShare;

    // constracter
    public OperationSystem(String osname, double share) {
        this.productName = osname;
        this.marketShare = share;
    }

    public String toString() {  // for System.out.println
        return this.productName + " : " + this.marketShare + "%";
    }
}

// sort/reverse key : productName
class ProductNameComparator implements Comparator {
    public int compare(Object o1, Object o2) {
        return ((OperationSystem)o1).productName.compareTo(((OperationSystem)o2).productName);
    }
}

// sort/reverse key : marketShare
class MarketShareComparator implements Comparator {
    public int compare(Object o1, Object o2) {
        if (((OperationSystem)o2).marketShare < ((OperationSystem)o1).marketShare) return 1;
        if (((OperationSystem)o2).marketShare > ((OperationSystem)o1).marketShare) return -1;
        return 0;
    }
}

public class OrigListSort2 {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
        ArrayList<OperationSystem> osl = new ArrayList<OperationSystem>();

        // set data
        osl.add(new OperationSystem("ZZ OS", 3.0D));
        osl.add(new OperationSystem("AA OS", 27.0D));
        osl.add(new OperationSystem("aa OS", 7.0D));
        osl.add(new OperationSystem("zz OS", 2.0D));
        osl.add(new OperationSystem("CC OS", 49.0D));
        osl.add(new OperationSystem("cc OS", 1.0D));

        System.out.println("-- TARGET DATA --\n" + osl);

        System.out.println("-- productName sort --");
        Collections.sort(osl, new ProductNameComparator());
        System.out.println("sort: " + osl);

        System.out.println("-- productName reverse --");
        Collections.sort(osl, new ProductNameComparator());
        Collections.reverse(osl);
        System.out.println("reverse: " + osl);

        System.out.println("-- marketShare sort --");
        Collections.sort(osl, new MarketShareComparator());
        System.out.println("sort: " + osl);

        System.out.println("-- marketShare -reverse -");
        Collections.sort(osl, new MarketShareComparator());
        Collections.reverse(osl);
        System.out.println("reverse: " + osl);
    }
}

ソートキーとして、productNameとmarketShareの両方をサポートできるように、
以下の2つのクラスを実装しています。

class ProductNameComparator implements Comparator {
    public int compare(Object o1, Object o2) {
    <snip>
}
// sort/reverse key : marketShare
class MarketShareComparator implements Comparator {
    public int compare(Object o1, Object o2) {
    <snip>
}

これは、Collectionsの以下のメソッドを使用したいため、Comparatorのcompareを実装しています。

  • Collections
    sort(List<T> list, Comparator<? super T> c)

ソース上で

Collections.sort(osl, new MarketShareComparator());
<snip>
Collections.sort(osl, new MarketShareComparator());

としている箇所になります。
compareを実装したクラスをnewしてCollections.sortにListと一緒に渡しています。

実行結果

以下、サンプルソースをコンパイルし実行した時の出力です。
productName, marketShareでソート・逆ソートされているのが確認できます。

$ javac OrigListSort2.java

$ java OrigListSort2
-- TARGET DATA --
[ZZ OS : 3.0%, AA OS : 27.0%, aa OS : 7.0%, zz OS : 2.0%, CC OS : 49.0%, cc OS : 1.0%]
-- productName sort --
sort: [AA OS : 27.0%, CC OS : 49.0%, ZZ OS : 3.0%, aa OS : 7.0%, cc OS : 1.0%, zz OS : 2.0%]
-- productName reverse --
reverse: [zz OS : 2.0%, cc OS : 1.0%, aa OS : 7.0%, ZZ OS : 3.0%, CC OS : 49.0%, AA OS : 27.0%]
-- marketShare sort --
sort: [cc OS : 1.0%, zz OS : 2.0%, ZZ OS : 3.0%, aa OS : 7.0%, AA OS : 27.0%, CC OS : 49.0%]
-- marketShare -reverse -
reverse: [CC OS : 49.0%, AA OS : 27.0%, aa OS : 7.0%, ZZ OS : 3.0%, zz OS : 2.0%, cc OS : 1.0%]

使用したJDKのバージョンは以下の通りです。

$ javac -version ; java -version
javac 1.8.0_102
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) Client VM (build 25.102-b14, mixed mode)

以上、独自(自作)クラスでキーを指定してソート・逆ソートするサンプルソースでした。


添付ファイル: fileOrigListSort2.java 57件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-07-07 (金) 15:19:06 (858d)