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(); } }
旧バージョン |
ここでは,比較に使うコンパレータは比較される Unit クラス内に記述するようにし,sort() 使用時に生成するようにした.
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(); } }
参考