技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

Java:任意の順番でのソート

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
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
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
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;}
  }

}
 
【実行結果】
文字コード順のソート]
カガミネ リン
カガミネ レン
ハツネ ミク
メグリネ ルカ

[独自ソート順のソート]
ハツネ ミク
カガミネ リン
カガミネ レン
メグリネ ルカ