【Java】ArrayListの要素をソート(並べ替え)する

ArrayListクラスで作る、可変長配列の要素を並べ替える方法をメモします。
(配列と同様、要素は追加した順番に並んでいる)

文字列(String型)を格納するListの要素をソートする

アルファベット順(A to Z)に並べ替える

List型の変数animalsをCollectionsクラスのsortメソッドの引数に渡してソートする。

変数animalsをコンソールに出力してソートの前後で並びを比較する。

public class Main {

	public static void main(String[] args) {

		List<String> animals = new ArrayList<String>();

		animals.add("dog");
		animals.add("ferret");
		animals.add("cat");
		animals.add("mouse");
		animals.add("bird");

		System.out.println("ソートなし:" + animals);

		Collections.sort(animals);
		System.out.println("ソートあり:" + animals);

	}

}

ソート後は要素がA to Zの並びに入れ替わる。

実行結果(コンソールに出力):

ソートなし:[dog, ferret, cat, mouse, bird]
ソートあり:[bird, cat, dog, ferret, mouse]

逆向き(Z to A)に並べ替える

逆向きに並べ替えたい場合は、
Collections.sortメソッドの二つ目の引数にCollectionsクラスのreverseOrder()メソッドを渡す。

Collections.sort(animals, Collections.reverseOrder());

自作のオブジェクトクラスを格納するListの要素をソートする

自分で作成したオブジェクトクラスを格納するListの要素を並べ替えたいとき、
並べ替えの基準をクラスのメンバー変数にすることが出来る。

id、name、ageの数値型と文字列型のメンバー変数を持つPersonクラスを定義する。

public class 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;
	}

}

数値型のメンバー変数でソートする (Comparatorを使用)

PersonクラスのInteger型メンバー、idを基準にListの要素を並べ替える。

public class Main {

	public static void main(String[] args) {

		ArrayList<Person> persons = new ArrayList<>();

		persons.add(new Person(2,"Andy", 40));
		persons.add(new Person(1, "Dave", 25));
		persons.add(new Person(4, "Beck", 17));
		persons.add(new Person(3,"Zack",32));

		System.out.println("ソート無し:" + persons);

		Collections.sort(persons, new Comparator<Person>() {
			@Override
			public int compare(Person personFirst, Person personSecond) {

				return Integer.compare(personFirst.getId(), personSecond.getId());

			}
		});
		System.out.println("comparatorでソート id順" + persons);

	}

}

実行結果(コンソールに出力):

ソート無し:[id=2, name=Andy, age=40, id=1, name=Dave, age=25, id=4, name=Beck, age=17, id=3, name=Zack, age=32]
comparatorでソート id順[id=1, name=Dave, age=25, id=2, name=Andy, age=40, id=3, name=Zack, age=32, id=4, name=Beck, age=17]

(14行目)
String型のList要素の並び替えと同様Collectionクラスのsortメソッドを使用し、
第2引数にjava.utilパッケージのComparatorインターフェースを指定する。

(16行目)
compareメソッドをオーバーライドして、Person型同士を比較するよう引数に渡す。

(18行目)
returnの値を※Integerクラスのcompareメソッドから返す。
2つのPerson型オブジェクトからメンバー変数idを取り出して引数に渡している。

ソートの順番を変える場合は、引数を逆向きにする。

※これでもOK

return personFirst.getId() - personSecond.getId();

※Integerクラスのcompareメソッド

compare(int x, int y)

2つのint値を比較する。

x == y の場合は値0、x < yの場合は-1、x > yの場合は1を返す。

文字列型のメンバー変数でソートする (Comparatorを使用)

PersonクラスのString型メンバー、nameを基準にListの要素を並べ替える。

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, new Comparator<Person>() {

			@Override
			public int compare(Person personFirst, Person personSecond) {

				return personFirst.getName().compareTo(personSecond.getName());
			}
		});
		System.out.println("comparatorでソート 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]
comparatorでソート 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]

(14行目)
Collectionクラスのsortメソッドを使用し、
第2引数にComparatorインターフェースを指定する。

(16行目)
compareメソッドをオーバーライドして、Person型同士を比較するよう引数に渡す。

(19行目)
StringクラスのcompareToメソッドで変数nameの値文字列を辞書的に比較した結果をreturnの戻り値にする。

Follow me!