#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) 以上、独自(自作)クラスでキーを指定してソート・逆ソートするサンプルソースでした。