#author("2017-07-07T15:18:15+09:00","","")
#author("2017-07-07T15:19:06+09:00","","")
#navi(../)
* 独自クラスでキー指定のソートサンプル [#xff612a1]
独自クラスにメンバー変数があり、処理によりソートするキー(メンバ変数)を指定したい場合の~
サンプルソースを以下に記します。~
ソートする方法は1つでいいのだ!と言う場合は、以下の記事を参照してください。
-[[独自クラスのソートサンプル>ソート/独自クラスのソートサンプル]]

#contents

* 関連記事 [#i8e98d42]
-[[ArrayListのソートサンプル>ソート/ArrayListのソートサンプル]]
-[[独自クラスのソートサンプル>ソート/独自クラスのソートサンプル]]
//-[[独自クラスでキー指定のソートサンプル>ソート/独自クラスでキー指定のソートサンプル]]

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

#ref(OrigListSort2.java)
 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と一緒に渡しています。

* 実行結果 [#x289ce85]
以下、サンプルソースをコンパイルし実行した時の出力です。~
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のバージョンは以下の通りです。
使用した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)


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

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS