Java :2つのオブジェクトを定義して並び変える(compare)
compare メソッドは、Comparator や Comparable インターフェースを使用して、オブジェクト間の順序を比較するために使います。具体的には、compare メソッドは2つのオブジェクトを比較して、それらの相対的な順序を定義します。compare メソッドを利用することで、Javaでのオブジェクトのカスタムソートを実現できます。
Comparable インターフェースの compareTo メソッド
Comparable インターフェースを実装するクラスは、オブジェクト自身のソート順序を定義できます。そのためには、compareTo メソッドをオーバーライドします。
使い方の例 (Comparable の compareTo)
compareTo メソッドを使ってオブジェクトを自然順序でソートする例です。自然順序とは「小さい順」「昇順」のことです。
compare の使い方のポイント
引数:
compare(T o1, T o2) は2つのオブジェクト o1 と o2 を比較します。
戻り値:
o1 が o2 より小さい場合は負の値を返します。
o1 と o2 が等しい場合は 0 を返します。
o1 が o2 より大きい場合は正の値を返します。
複数の条件でソート:
条件が複数ある場合、if-else ブロックや三項演算子を使って比較順序を決定します。
例えば、Person クラスを年齢で比較してソートする場合:
class Person implements Comparable<Person> {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
// compareToメソッドをオーバーライドして、年齢で比較
@Override
public int compareTo(Person other) {
return this.age - other.age; // 年齢が小さい順にソート
}
@Override
public String toString() {
return this.name + " (" + this.age + ")";
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 28));
// ComparableのcompareToを使ってソート
Collections.sort(people);
// ソート結果を出力
for (Person p : people) {
System.out.println(p);
}
}
}
上記の例では、compareTo メソッドを使って Person クラスのオブジェクトを年齢の昇順に並べています。
Comparator インターフェースの compare メソッド
Comparator インターフェースは、クラスの外からオブジェクトの順序を指定したい場合に使います。この場合、compare メソッドを実装して比較ルールを定義します。
使い方の例 (Comparator の compare)
次に、Comparator を使用して異なるフィールド(例えば名前)で Person クラスのオブジェクトをソートする例を見てみましょう。
import java.util.*;
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return this.name + " (" + this.age + ")";
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person("Alice", 30));
people.add(new Person("Bob", 25));
people.add(new Person("Charlie", 28));
// 名前で比較するComparatorを定義
Comparator<Person> nameComparator = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.name.compareTo(p2.name); // 名前で比較
}
};
// 名前順にソート
Collections.sort(people, nameComparator);
// ソート結果を出力
for (Person p : people) {
System.out.println(p);
}
}
}
この例では、Comparator を使用して名前順に Person オブジェクトをソートしています。
複数条件で compare を使う例
たとえば、次のように複数条件でソートする場合を考えます。まず銀の量が多い順に並び、銀の量が同じなら金の量で並び替えるという例です。
import java.util.*;
class Person {
int gold;
int silver;
Person(int gold, int silver) {
this.gold = gold;
this.silver = silver;
}
@Override
public String toString() {
return "Gold: " + this.gold + ", Silver: " + this.silver;
}
}
public class Main {
public static void main(String[] args) {
List<Person> people = new ArrayList<>();
people.add(new Person(10, 50));
people.add(new Person(30, 50));
people.add(new Person(20, 30));
// 銀が多い順、同じ銀の場合は金が多い順に並べるComparator
Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
if (p1.silver != p2.silver) {
return p2.silver - p1.silver; // 銀の量で降順
} else {
return p2.gold - p1.gold; // 銀が同じなら金の量で降順
}
}
};
// ソート実行
Collections.sort(people, comparator);
// 結果を表示
for (Person p : people) {
System.out.println(p);
}
}
}
上記のコードでは、銀の量が多い順でソートし、銀の量が同じ場合には金の量が多い順にソートしています。
まとめ
Comparable は、オブジェクト自体に順序を定義するために compareTo メソッドを実装します。
Comparator は、外部から順序を指定するために compare メソッドを実装します。
どちらの方法でも、オブジェクトのソート基準をカスタマイズすることが可能です。
Java 8 以降は、Comparator を使う際にラムダ式でより簡潔に記述することもできます。