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();
}
}参考