Points & Lines

【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]

Follow me!

モバイルバージョンを終了