自作のオブジェクトクラスを要素にもつListを並べ替える際、
Comparableインターフェースを実装して順序を定義する方法をメモ。
Comparableインターフェースを実装する
自作のオブジェクトクラスPersonクラス
public class Person implements Comparable<Person> {
private Integer id;
private String name;
private Integer age;
public Person(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getAge() {
return this.age;
}
public int getId() {
return this.id;
}
public String getName() {
return this.name;
}
@Override
public String toString() {
return "id=" + id + ", name=" + name + ", age=" + age;
}
//順序を定義
@Override
public int compareTo(Person other) {
return Integer.compare(this.age, other.getAge());
}
}
Comparableインターフェースを実装し、compareToメソッドをオーバーライド実装する。
(Comparableインターフェースの型引数<>は同じPerson型にする)
数値型(Integer)型変数で並び替える
Personクラスの数値型メンバー変数ageを対象に、
Integerクラスのcompareメソッドで順序比較する。
(比較するオブジェクトをotherとしている)
Mainクラス
Collectionsクラスのsortメソッドの引数に
Person型のオブジェクトを追加した変数personsを渡してソートする。
public class Main {
public static void main(String[] args) {
ArrayList<Person> persons = new ArrayList<>();
persons.add(new Person(3,"Zack",32));
persons.add(new Person(2,"Andy", 40));
persons.add(new Person(1, "Dave", 25));
persons.add(new Person(4, "Beck", 17));
System.out.println("ソート無し:" + persons);
Collections.sort(persons);
System.out.println("ageでソート:" + persons);
}
}
実行結果(コンソールに出力):
ソート無し:[id=3, name=Zack, age=32, id=2, name=Andy, age=40, id=1, name=Dave, age=25, id=4, name=Beck, age=17]
ageでソート:[id=4, name=Beck, age=17, id=1, name=Dave, age=25, id=3, name=Zack, age=32, id=2, name=Andy, age=40]
文字列(String)型変数で並び替える
Personクラスのメンバー変数、nameの値で並びを定義する。
StringクラスのcompareToメソッドで変数nameの文字列順序を比較する。
オーバーライドするcompareToメソッドの実装
public class Person implements Comparable<Person> {
private Integer id;
private String name;
private Integer age;
//中略
//順序を定義
@Override
public int compareTo(Person other) {
return this.name.compareTo(other.getName());
}
}
public class Main {
public static void main(String[] args) {
ArrayList<Person> persons = new ArrayList<>();
persons.add(new Person(3,"Zack",32));
persons.add(new Person(2,"Andy", 40));
persons.add(new Person(1, "Dave", 25));
persons.add(new Person(4, "Beck", 17));
System.out.println("ソート無し:" + persons);
Collections.sort(persons);
System.out.println("nameでソート:" + persons);
}
}
実行結果(コンソールに出力):
ソート無し:[id=3, name=Zack, age=32, id=2, name=Andy, age=40, id=1, name=Dave, age=25, id=4, name=Beck, age=17]
nameでソート:[id=2, name=Andy, age=40, id=4, name=Beck, age=17, id=1, name=Dave, age=25, id=3, name=Zack, age=32]
