目次> 第13章> 13.4 TOPUPPREVNEXT

13.4 TreeSet クラス と Iterator インターフェース

ここまで頑張ってきて、
2つのオブジェクトの比較(大小の判定)ができる場合に、
といったアルゴリズムを組み立て、実際にプログラムを作成できるようになりました。

センスや腕を磨くには、自分でプログラムを作成するのが早道ですが、 Javaにはいろいろなクラスやインターフェースが用意されていて、 あまり複雑なプログラムを作成しなくてもよいようになっています。

ソートはどうでしょう?
さまざまな、仕掛けが用意されています。

たとえば、配列 hairestu 全体にデータがつまっている場合に、 単にソートをしたいだけであれば、

Arrays.sort( hairestu );
とするだけです。本当にできるかどうかを、 ソースプログラム Sort3x.java でみてみましょう。
import java.util.Arrays; が必要ですが、1行だけでソートができています。

実際のプログラムでは、こんな単純なケースはまれで、たとえば 全学生の成績を、合計点順に表示したり、学籍番号順に印刷したり、 特定の講座の点数順にならべたり、といった作業になります。

利用範囲の広い、 TreeSet クラス を使ってみましょう。
行番号が赤色の行が、前節の Sort3.java に対する修正個所です。

01:/* 配列の宣言と初期化 およびソート(TreeSet)*/
02:
03:import java.awt.* ;
04:import java.awt.event.* ;
05:import javax.swing.* ;
06:import java.util.TreeSet;
07:import java.util.Iterator;
08:
09:public class Sort4 {
10:
11:	public static void main(String args[]) {
12:
13:	String [] data = { "National Public Safety Commission",
14:	                   "Defense Agency",
15:	                   "Financial Services Agency",
16:	                   "Ministry of Public Management, Home Affairs, " +
17:	                      "Posts and Telecommunications",
18:	                   "Ministry of Justice",
19:	                   "Ministry of Foreign Affairs",
20:	                   "Ministry of Finance",
21:	                   "Ministry of Economy, Trade and Industry",
22:	                   "Ministry of Land, Infrastructure and Transport",
23:	                   "Ministry of Agriculture, Forestry and Fisheries",
24:	                   "Ministry of Environment",
25:	                   "Ministry of Health, Labor and Welfare",
26:	                   "Ministry of Education, Culture, Sports, " +
27:	                      "Science and Technology" };
28:
29:		JFrame frame = new JFrame("配列のソート");
30:		frame.addWindowListener(new WindowAdapter() {
31:			public void windowClosing(WindowEvent e) { System.exit(0); }
32:		});
33:		Container pane = frame.getContentPane();
34:		pane.setLayout(new GridLayout(0, 2, 10, 10));
35:		JPanel leftPanel  = new JPanel(new GridLayout(0, 1, 10, 10));
36:		JPanel rightPanel = new JPanel(new GridLayout(0, 1, 10, 10));
37:		pane.add(leftPanel);
38:		pane.add(rightPanel);
39:
40:		TreeSet cabinet = new TreeSet();
41:		for(int i=0; i<data.length; i++) {
42:			cabinet.add( data[i] );
43:			leftPanel.add( new JLabel( data[i] ) );
44:		}
45:
46:		Iterator it = cabinet.iterator();
47:
48:		while(it.hasNext()) {
49:			rightPanel.add( new JLabel( (String)it.next() ) );
50:		}
51:
52:		frame.pack();
53:		frame.setVisible(true);
54:	}
55:}

手順は、次の通りです。

TreeSet に データを渡し(add) 、 Iteratorを生成して、取り出せば、 昇順に渡してもらえる仕掛けです。 ただし、型の情報がなくなって、 Object クラス として戻ってくるので、49行目の (String) のように型変換をしてから、 利用する必要があります。

Java 5.0 では、型を指定したコレクション( TreeSet等 )が扱えるよう言語仕様が拡張されました。
また、拡張forループ によって、Iterator を使用せずにコレクションの要素を順にアクセスできるようになりました。

ソースプログラム Sort4.java
ソースプログラム Sort4T.java (J2SE 5.0 でのプログラム例 Sort4.java との相違点

Iterator を入手した後、データを取り出し終わらないうちに、データを add すると 例外が発生する仕組みになっています。

ソースプログラム Sort5.java

最後まで取り出し終わってからの、追加は可能です。

ソースプログラム Sort5a.java

追加は可能ですが、追加した結果を古いイテレータで読み出すことはできません。 実行結果は次のようになります。

データを追加したら、イテレータを作成しなおして先頭から読み直す、 というように作られています。


更新日:2005-07-18 TOPUPPREVNEXT