クラスのソートサンプル

[2008/11/06], [2005/01/08]

コンパラブルによるクラス内の値の比較

Comparable を実装したクラスを作成し,compareTo() を比較関数として用意すれば,Arrays.sort() に自身の配列を渡すだけで並べ替えができる.
Foo.java (その1)
import java.util.Arrays;

// ユニットクラス
class Unit implements Comparable<Unit> {
  float value;

  Unit() {
    // 生成時に初期値を設定
    value=(float)(Math.random());
  }

  // 自身と他 Unit との比較関数
  public int compareTo(Unit x) {
    if (value>x.value) return -1; // 大きい方が上位になる
    else if (value<x.value) return 1;
    return 0;
  }
}

public class Foo {
  Unit u[];

  // ユニットのソート
  void init() {
     // Array.sort() を呼び出すと対象クラス(ここでは Unit)内の compareTo メソッドが呼ばれる
     Arrays.sort(u);
  }

  // ユニットの初期化
  void init() {
    u=new Unit[20];
    for (int i=0; i<u.length; i++) u[i]=new Unit();
  }

  // ユニットの状態表示
  void show() {
    for (int i=0; i<u.length; i++) System.out.printf("%d: %6.2f\n", i, u[i].value);
    System.out.printf("---\n");
  }

  Foo() {
    // ユニットの生成
    init();
    show();

    // ユニットのソート
    sort();
    show();
  }

  public static void main(String args[]) {
    new Foo();
  }
}

コンパレータによるクラス内の値の比較

旧バージョン
Arrays.sort() にソートしたいオブジェクトの配列と,さらにその内容を比較するコンパレータを渡せばArrays クラスが並べ換えを行なってくれる.

ここでは,比較に使うコンパレータは比較される Unit クラス内に記述するようにし,sort() 使用時に生成するようにした.

Foo.java (その2)
import java.util.Arrays;
import java.util.Comparator;

// ユニットクラス
class Unit {
  float value;

  Unit() {
    // 生成時に初期値を設定
    value=(float)(Math.random());
  }

  // ユニットクラス用のコンパレータを生成し返す
  public static Comparator comparator() {
    return new Comparator<Unit>() {
      public int compare (Unit a, Unit b) { // 受け取った2つのオブジェクトを比較し 0,1,-1を返す
        if (a.value>b.value) return -1;     // 大きい方が上位になる
        else if (a.value<b.value) return 1;
        return 0;
      }
    };
  }
}

public class Foo {
  Unit u[];

  // ユニットのソート
  void sort() {
     // ここでコンパレータを指定して Array.sort() を呼び出すと
     // そのコンパレータクラス内の compare() メソッドが呼ばれる
     Arrays.sort(u, Unit.comparator());
  }

  // ユニットの初期化
  void init() {
    u=new Unit[20];
    for (int i=0; i<u.length; i++) u[i]=new Unit();
  }

  // ユニットの状態表示
  void show() {
    for (int i=0; i<u.length; i++) System.out.printf("%d: %6.2f\n", i, u[i].value);
    System.out.printf("---\n");
  }

  Foo() {
    // ユニットの生成
    init();
    show();

    // ユニットのソート
    sort();
    show();
  }

  public static void main(String args[]) {
    new Foo();
  }
}

参考


上へ