JavaのCollection型(サブクラスにList型等がある)は、Collections.sortメソッドでソートすることが可能です。
Collections.sortメソッドは、第一引数にソートしたいCollection型のオブジェクト、第二引数にComparator型のオブジェクトを渡します。
第二引数のComparator型のオブジェクトにより、ソート順が決まります。
Collections.sortメソッドでは、Comparator型のcompareメソッドを利用してソートを行います。
ソート順を定義するためには、Comparator型を実装したクラスを独自に作成し、compareメソッドをオーバーライドして独自のロジックを記述する必要があります。
compareメソッドの説明は以下です。
https://docs.oracle.com/javase/jp/8/docs/api/java/util/Comparator.html#compare-T-T-
簡単に言うと、compareメソッドの第一引数と第二引数について、戻り値がマイナスの値の場合は「第一引数→第二引数」の順番に並び、戻り値がプラスの値の場合は「第二引数→第一引数」の順番に並びます。
これを利用して、任意の順番でソートを行うサンプルが以下になります。
【サンプルコード】
・MySortMain.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; public class MySortMain { public static void main(String[] args) { // ソート対象のリストを作成する List<String> list = new ArrayList<>(); list.add("メグリネ ルカ"); list.add("ハツネ ミク"); list.add("カガミネ レン"); list.add("カガミネ リン"); // ソート(文字コード順) Comparator<String> mySort1 = new MySort1(); Collections.sort(list, mySort1); System.out.println("[文字コード順のソート]"); for (String str : list) { System.out.println(str); } // ソート(独自ソート順) Comparator<String> mySort2 = new MySort2(); Collections.sort(list, mySort2); System.out.println(""); System.out.println("[独自ソート順のソート]"); for (String str : list) { System.out.println(str); } } } |
・MySort1.java
1 2 3 4 5 6 7 8 9 10 11 12 |
import java.util.Comparator; // 今回はString型を対象としているが、独自型にも同じ方法で対応できる public class MySort1 implements Comparator<String> { @Override public int compare(String o1, String o2) { // o1の文字コードからo2の文字コードを減算した値を返すメソッド return o1.compareTo(o2); } } |
・MySort2.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.util.Comparator; // 今回はString型を対象としているが、独自型にも同じ方法で対応できる public class MySort2 implements Comparator<String> { @Override public int compare(String o1, String o2) { return mySortOrder(o1) - mySortOrder(o2); } // 独自のソート順の定義 public int mySortOrder(String str) { if (str.equals("ハツネ ミク")) { return 1; } else if (str.equals("カガミネ リン")) { return 2; } else if (str.equals("カガミネ レン")) { return 3; } else if (str.equals("メグリネ ルカ")) { return 4; } else {return 5;} } } |
【実行結果】
1 2 3 4 5 6 7 8 9 10 11 |
[文字コード順のソート] カガミネ リン カガミネ レン ハツネ ミク メグリネ ルカ [独自ソート順のソート] ハツネ ミク カガミネ リン カガミネ レン メグリネ ルカ |
いかがでしたでしょうか。
javaで独自順のソート処理をする機会があったので、実装方法を簡単に書いてみました。
Comparatorインターフェースのcompareメソッドを実装すること、compareメソッドの戻り値によりソート順を定義すること、を抑えれば、何をしているか理解できると思います。
コメント