読者です 読者をやめる 読者になる 読者になる

Javaで配列をソートする

Javaで配列をソートするときの備忘録。

まずは基本のき

int[] a = {5, 2, 4, 1, 3};                                                            
Arrays.sort(a);
//結果a = {1, 2, 3, 4, 5}となる

もちろん、順序が定義されているクラスは、intじゃなくてもArrays.sort()を使うことができる。

Date[] b = {new Date(100000000), new Date(50000000), new Date(0)};
Arrays.sort(b);

自分で作ったクラスでは、どうするか

1.自分で作ったクラスでComparableインターフェイスを実装しておく。intを返すようにちゃんとかく。

自ら比較する能力がある(-able)クラスを作っておく。

class MyClassComparable implements Comparable<MyClassComparable> {
  //フィールド変数に整数xとyをもつクラス
  int x;
  int y;
  public MyClassComparable (int x, int y) {
    this.x = x;
    this.y = y;
  }
  public int compareTo(MyClassComparable other) { //ここを実装する
    return this.x + this.y - (other.x + other.y); //2つの整数の合計が大きい方が、同じクラスを比較した時に大きいとした
  }
}

のようにしておけば、

MyClassComparable[] c = {new MyClassComparable(1, 5), new MyClassComparable(2,1) , new MyClassComparable(3,1)};
Arrays.sort(c);

のように、基本のきのように使うだけ。

2.コンパレーターインターフェイスを実装しておく。

インスタンスを比較するやつ(クラス)を作っておく。
こんな感じで、MyClassとMyComparatorをかいておく。

class MyClass {
  int x;
  int y;
  public MyClass (int x, int y) {
    this.x = x;
    this.y = y;
  }
}
class MyComparator implements Comparator<MyClass> {
  public int compare(MyClass m1, MyClass m2) {
    return m1.x + m1.y - (m2.x + m2.y);
  }
}

で、使うときは、Arrays.sort()にこんな感じで渡す。

MyClass[] d = {new MyClass(1, 5), new MyClass(2,1) , new MyClass(3,1)};
Arrays.sort(d, new MyComparator());
2'. 無名クラスでComparatorを作って渡す

MyClassで、implaments Comparableと加えるのも、新たにMyComparatorを追加するのも、あれだなーというときは、Comparatorを無名クラスで作って渡せばよい。

Arrays.sort(e, new Comparator<MyClass>(){
  public int compare(MyClass m1, MyClass m2){
  return m1.x + m1.y - (m2.x + m2.y);}});

多次元配列で2番目の要素で比較する

ベストプラクティスがよくわからなったけど、配列用のComparatorを作って渡せばよいので、こんな感じなるのかな?
何度も使うなら、Comparatorを作っておけばいいと思うし、今回だけ使うみたなときは無名クラスで渡してしまえばいいかなと。以下は、無名クラスで渡す場合。

double[][] f = {{1.0, 3.0},{2.0,2.0},{3.0,4.0},{4.0,1.0},{5.0,3.0}}; //2番目の要素で並べ替えたい
Arrays.sort(f, new Comparator<double[]>() { //double[]でコンパレーターを実装する
  public int compare(double[] a, double[] b) {
    if(a[1] > b[1]) {
      return 1;
    }else if (a[1] == b[1]) {
      return 0;
    }else {
      return -1;
  }}});

いじょ。