java学習 ArrayListのソート、ソートのカスタム
Effective Java 第2版 (The Java Series)
- 作者: Joshua Bloch,柴田芳樹
- 出版社/メーカー: ピアソンエデュケーション
- 発売日: 2008/11/27
- メディア: 単行本(ソフトカバー)
- 購入: 77人 クリック: 936回
- この商品を含むブログ (264件) を見る
Arrayクラスがjava.util.Arraysでバイナリサーチやソートが簡単にできるのに比べて、ArrayListはどうなんだろうなどと思っていたらCollections.sortでソートできるとの@nise_nabeさんからのアドバイス。
ソートの比較関数を変えるには、java.util.Comparatorを継承してcompareメソッドをオーバーライドしたクラスを定義して、Collection.sortの呼び出し時にそのインスタンスを第2引数として渡す。
まずは、基本型の昇順ソート
import java.util.ArrayList; import java.util.Collections; public class SortArrayList { public static void main(String[] args) { ArrayList<Integer> lst = new ArrayList<Integer>(); // fill lst.add(42); lst.add(24); lst.add(128); lst.add(127); // sort Collections.sort(lst); // print System.out.println(lst); } } //出力結果: //[24, 42, 127, 128] //
次はユーザ定義クラスの昇順ソート。
/* * ユーザ定義クラスのソート * 参考: * http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/ArrayList.html * http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/util/Comparator.html */ import java.util.ArrayList; import java.util.Collections; public class SortArrayListCustom { public static void main(String[] args) { ArrayList<Person> lst = new ArrayList<Person>(); lst.add(new Person("alice", 4)); lst.add(new Person("bob", 34)); lst.add(new Person("carol", 13)); lst.add(new Person("david", 18)); System.out.println(lst); Collections.sort(lst, new PersonComparator()); System.out.println(lst); } } class Person { private String name; private int age; Person(String n, int a) { name = n; age = a; } int getAge() { return age; } String getName() { return name; } public String toString() { return "<" + getName() + " " + getAge() + ">"; } } class PersonComparator implements java.util.Comparator { public int compare(Object s, Object t) { // + (x > y) // compare x y = 0 (x = y) // - (x < y) return ((Person) s).getAge() - ((Person) t).getAge(); } } //出力結果: //[<alice 4>, <bob 34>, <carol 13>, <david 18>] //[<alice 4>, <carol 13>, <david 18>, <bob 34>] //