![]() | SortOrder | サンプルソース |
|---|---|---|
名前を並び替えたいんだけど、そのままだと漢字コード順に並んじゃう。やっぱり、読み仮名順に並び替えたいよね。インナークラスの解説もあるぞ。 |
SortOrder.java |
/**
* 愛のJava256本ノック for Java 5.0
* Javaサンプルソース ver0.2C "SortOrder"
* SortOrder.java 「読み仮名順に名前をソート」
*
* 2005/09/23 制作:安永ノリカズ
*
* 【コンパイル&実行方法】
* >javac SortOrder.java
* >java SortOrder
* 【キーワード】
* 無名インナクラス(anonymous inner class), 並べ替え(sort),
* java.lang.Comparableインターフェース
*
* 【試してみよう】
* 50音の降順(逆順)で並べ替える。
* Personクラスに年齢などを追加して、その項目で並べ替える。
* コンパイル後、どんな.classファイルが出来たのか確認する。
*/
import java.lang.String;
import java.lang.System;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortOrder {
class Person {
String I00;
String I01;
public Person(String A00, String A01) {
this.I00 = A00;
this.I01 = A01;
}
}
public SortOrder() {
List<Person> L00 = new ArrayList<Person>();
L00.add(new Person("小泉純一郎", "こいずみ じゅんいちろう"));
L00.add(new Person("ペ・ヨンジュン", "ぺ よんじゅん"));
L00.add(new Person("堀江貴文", "ほりえ たかふみ"));
L00.add(new Person("王 貞治", "おう さだはる"));
L00.add(new Person("プリティ長嶋", "ながしま ぷりてぃ"));
System.out.println("---- 並び替え前 ----");
for (Person L01 : L00) {
System.out.printf("%s(%s)%n", L01.I00, L01.I01);
}
Collections.sort(L00, new Comparator<Person>() {
public int compare(Person A00, Person A01) {
return A00.I01.compareTo(A01.I01);
}
});
System.out.println("\n---- 50音順 ----");
for (Person L02 : L00) {
System.out.printf("%s(%s)%n", L02.I00, L02.I01);
}
}
public static void main(String[] args) {
new SortOrder();
}
}
/* ■ クラスの外でちょっと一言 ■
自分で設計したクラスのインスタンスを並べ替えるには、前もってComparableイ
ンターフェースを実装しておく方法と、ソート時にComparatorを指定する方法の
2つがあります。今回紹介するのは後者の方。この方法なら、指定する
Comparatorを変えることで、様々な順序に並べ変えることが可能です。
このサンプルには2つのインナークラスが登場します。インナークラスとはクラ
スの中に定義されたクラスのこと。1つはPersonクラス。これは分かりやすいで
すよね。もう1つは、Collections.sortメソッドの引数の中で無名(匿名)イン
ナークラスとして定義されています。
無名インナークラスってのは、クラス定義の省略形で、ほんの数行、しかも他か
ら参照されないようなその場限りのクラスを作る場合に、「わざわざ名前をつけ
て定義するほどでもねーな」ってときに使います。ただし、あまり長い無名イン
ナークラスを作ってしまうと、処理の流れが見えにくくなってしまいます。そう
いう場合には、通常の名前つきインナークラスで記述すべきですね。
J2SE 5.0の新機能「ジェネリックス」はListやMapなどのコレクション系が有名
ですが、Comparatorにも使えます。Object型をキャストしなくていいですし、間
違って違う型を渡す心配もなく、安全ですね。
*/