【Java】Comparableインターフェースを実装してListの要素をソートする
自作のオブジェクトクラスを要素にもつ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]