java学習 ArrayListのソート、ソートのカスタム

Effective Java 第2版 (The Java Series)

Effective Java 第2版 (The Java Series)

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