【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の戻り値にする。

