compareTo() メソッドの親戚ともいえる、Comparator について記述します。
Comparator とは?
オブジェクト同士を比較し、どちらが大きいか小さいかを判定することに特化したクラス(或いはインターフェース)です。
そのため、役割は compareTo() メソッドと同じと言えます。
比較に特化したクラスとして独立させることが可能な点が、Comparable インターフェース・compareTo() メソッドとの違いです。
Comparator の作成方法
java.util.Comparator インターフェースを implement して作成します。
ちなみに、メソッド名は compare() で、比較するオブジェクト同士を引数に取ります。
Comparator の仕様・規約
compareTo() メソッドと同様です。
Comparator の使い方
Collection フレームワークに、Comparator を指定できる API があります。
例えば java.util.Arrays クラスの sort() メソッドには、ソートしたい配列と Comparator とを引数として与えられるものがあります。
実装例
引数の多いコンストラクタの説明で使用した NutritionFacts クラスを例に、Comparator の実装例を示します。
public class NutritionFacts { // fields // 内容量 private int servingSize; // 1人前の量 private int servings; // カロリー private int calories; // 脂肪 private int fat; // ナトリウム private int sodium; // 炭水化物 private int carbohydrate; // getter/setter/constructor は省略 /** * 当クラス独自の Comparator * * 内容量・1人前の量・カロリー・脂肪・ナトリウム・炭水化物の順に、値を比較する。 */ public static class NutritionFactsComparator implements Comparator{ // ●implements の指定方法は、Comparable の時と同じ。 public int compare(NutritionFacts target1, NutritionFacts target2) { // 引数の null チェック if (target1 == null) { throw new NullPointerException("target1 is null."); } if (target2 == null) { throw new NullPointerException("target2 is null."); } // 内容量 if (target1.servingSize > target2.servingSize) { return 1; } if (target1.servingSize < target2.servingSize) { return -1; } // 1人前の量 if (target1.servings > target2.servings) { return 1; } if (target1.servings < target2.servings) { return -1; } // カロリー if (target1.calories > target2.calories) { return 1; } if (target1.calories < target2.calories) { return -1; } // 脂肪 if (target1.fat > target2.fat) { return 1; } if (target1.fat < target2.fat) { return -1; } // ナトリウム if (target1.sodium > target2.sodium) { return 1; } if (target1.sodium < target2.sodium) { return -1; } // 炭水化物 if (target1.carbohydrate > target2.carbohydrate) { return 1; } if (target1.carbohydrate < target2.carbohydrate) { return -1; } return 0; } } }