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