18 Java標準APIによる集合データ構造

18.1 学習目標

18.2 APIとJavaAPIドキュメント

API(Application Programming Interface)とは,アプリケーション(みなさんが作るプログラム)が利用できるメソッドのことです.

タートルプログラムは,松澤が開発した(している)プログラムで,rt(),fd()などのメソッドがAPIとして提供されています.

Java標準ライブラリの説明書は,以下にあります.

Java標準ライブラリは,クラス単位で閲覧することが出来ます.

例えば,本章で利用する.LinkedListのAPIドキュメントを読んでみましょう.

18.3 LinkedList

ListTurtleは中身が見えて便利なのですが,Java標準ライブラリでは使えないのが難点です. 将来はJava標準ライブラリで書かれたプログラムを読む必要もあるので,標準ライブラリ方式も勉強しておきましょう. (なお,カーソル以外はListTurtleと同様に利用できるようにListTurtleをつくってあります.)

18.3.1 カーソルを使わない方法

Java標準ライブラリには「カーソル」がありません. 従って,先に説明した4匹の亀のアニメーションについて,カーソルを使わない方法で書き直しておきましょう.

リスト 18.3.1.1 FourTurtles2.java
  1: /*
  2:  * FourTurtles2.java
  3:  * 4匹の亀を動かすプログラム2(ListTurtle+getterで管理する)
  4:  * Created on 2012/01/07
  5:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  6:  */
  7: public class FourTurtles2 extends Turtle {
  8: 
  9: 	// 起動処理
 10: 	public static void main(String[] args) {
 11: 		Turtle.startTurtle(new FourTurtles2(), args);
 12: 	}
 13: 
 14: 	// タートルを動かす処理
 15: 	public void start() {
 16: 		// ウインドウの準備
 17: 		hide();
 18: 		window.setSize(1100, 500);
 19: 
 20: 		// リスト(入れ物)を作る
 21: 		ListTurtle<Turtle> turtles = new ListTurtle<Turtle>();
 22: 		turtles.warpByTopLeft(100, 300);
 23: 
 24: 		// 4匹のカメを生成
 25: 		for (int i = 0; i < 4; i++) {
 26: 			turtles.add(new Turtle());
 27: 		}
 28: 
 29: 		// 初期位置へ移動
 30: 		turtles.get(0).warp(100, 100);
 31: 		turtles.get(1).warp(100, 200);
 32: 		turtles.get(2).warp(200, 100);
 33: 		turtles.get(3).warp(200, 200);
 34: 
 35: 		// カメを動かす
 36: 		for (int i = 0; i < 360; i++) {
 37: 			for (int j = 0; j < 4; j++) {
 38: 				turtles.get(j).fd(1);
 39: 				turtles.get(j).rt(1);
 40: 			}
 41: 		}
 42: 	}
 43: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、FourTurtles2プログラムが実行できます。

18.3.2 LinkedList

Java標準ライブラリの書き方になります.タートルの画面に表示されないことと,import文以外はほとんど書き方は変わりません.

リスト 18.3.2.1 FourTurtles3.java
  1: import java.util.LinkedList;
  2: 
  3: /*
  4:  * FourTurtles3.java
  5:  * 4匹の亀を動かすプログラム3(LinkedListで管理する)
  6:  * Created on 2012/01/07
  7:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  8:  */
  9: public class FourTurtles3 extends Turtle {
 10: 
 11: 	// 起動処理
 12: 	public static void main(String[] args) {
 13: 		Turtle.startTurtle(new FourTurtles3(), args);
 14: 	}
 15: 
 16: 	// タートルを動かす処理
 17: 	public void start() {
 18: 		// ウインドウの準備
 19: 		hide();
 20: 		window.setSize(1100, 500);
 21: 
 22: 		// リスト(入れ物)を作る - JavaライブラリのLinkedList
 23: 		LinkedList<Turtle> turtles = new LinkedList<Turtle>();
 24: 
 25: 		// 4匹のカメを生成
 26: 		for (int i = 0; i < 4; i++) {
 27: 			turtles.add(new Turtle());
 28: 		}
 29: 
 30: 		// 初期位置へ移動
 31: 		turtles.get(0).warp(100, 100);
 32: 		turtles.get(1).warp(100, 200);
 33: 		turtles.get(2).warp(200, 100);
 34: 		turtles.get(3).warp(200, 200);
 35: 
 36: 		// カメを動かす
 37: 		for (int i = 0; i < 360; i++) {
 38: 			for (int j = 0; j < 4; j++) {
 39: 				turtles.get(j).fd(1);
 40: 				turtles.get(j).rt(1);
 41: 			}
 42: 		}
 43: 	}
 44: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、FourTurtles3プログラムが実行できます。

Java標準ライブラリのimport

Java標準ライブラリを使うには,import文を使う必要があるときがあります.前のプログラムでは,1行目に書いてありました.

				
	import java.util.LinkedList;
						

import宣言は,クラスブロックが始まる前の所(上の方)に書きます.

import宣言をすると,正式名称がjava.util.LinkedListであるクラスが,LinkedListと省略してプログラムで扱うことが出来るようになります.

18.4 配列

最近のオブジェクト指向言語ではList(LinkedListやArrayList)を使うのが主流ですが,まだライブラリで一部使われているのが配列です.

リスト 18.4.1 FourTurtles4.java
  1: /*
  2:  * FourTurtles4.java
  3:  * 4匹の亀を動かすプログラム4(配列で管理する)
  4:  * Created on 2012/01/07
  5:  * Copyright(c) 2011 Yoshiaki Matsuzawa, Shizuoka University. All rights reserved.
  6:  */
  7: public class FourTurtles4 extends Turtle {
  8: 
  9: 	// 起動処理
 10: 	public static void main(String[] args) {
 11: 		Turtle.startTurtle(new FourTurtles4(), args);
 12: 	}
 13: 
 14: 	// タートルを動かす処理
 15: 	public void start() {
 16: 		// ウインドウの準備
 17: 		hide();
 18: 		window.setSize(1100, 500);
 19: 
 20: 		// リスト(入れ物)を作る - Javaの配列機能を使って作る
 21: 		Turtle[] turtles = new Turtle[4];
 22: 
 23: 		// 4匹のカメを生成
 24: 		for (int i = 0; i < 4; i++) {
 25: 			turtles[i] = new Turtle();
 26: 		}
 27: 
 28: 		// 初期位置へ移動
 29: 		turtles[0].warp(100, 100);
 30: 		turtles[1].warp(100, 200);
 31: 		turtles[2].warp(200, 100);
 32: 		turtles[3].warp(200, 200);
 33: 
 34: 		// カメを動かす
 35: 		for (int i = 0; i < 360; i++) {
 36: 			for (int j = 0; j < 4; j++) {
 37: 				turtles[j].fd(1);
 38: 				turtles[j].rt(1);
 39: 			}
 40: 		}
 41: 	}
 42: }

ここ をクリックすると、プログラムをダウンロードできます。

下のボタンを押すと、FourTurtles4プログラムが実行できます。

配列は,要素の上限を決めないと使えないところが(LinkedListはメモリの許す限り無限)欠点です.

18.4.1 配列の使い方

要素のクラス名[] (変数名) = new要素のクラス名[大きさ(数字)]
配列を作成します.(例Turtle[] turtles = new Turtles[4]; String[] texts = new String[4]; int[] numbers = new int[5];)
変数名[添字] =値
添字の位置に値を代入します(例turtles[0] = new Turtle(); texts[1] = "hoge"; numbers[3] = 3;)
変数名[添字]
添字番目の要素を取得します.(例turtles[0].fd(100); String x = texts[2]; int y = numbers[3];)

添字は0から始まるので注意. 添字はint型の変数でもOK.例)

				
	int[] numbers = new int[5];
	int x = 3;
	numbers[x] = x;
						
この例では,numbersの3番目の要素に3を代入している.

18.5 集合データ構造の使い方のまとめ

ListTurtle, LinkedList, 配列では概ね同じ事ができます.以下に対応をまとめました.

表 18.5.1 まとめ
(操作) ListTurtle LinkedList 配列
作成 ListTurtle<[入れるクラスの型]> aList = new ListTurtle<[入れるクラスの型]>(); LinkedList<[入れるクラスの型]> aList = new LinkedList<[入れるクラスの型]>(); [入れるクラスの型][] aList = new [入れるクラスの型][[配列に入れられる要素数]];
挿入 aList.add([入れたいもの]); aList.add([入れたいもの]); aList[入れたいものの番地(0から)] = [入れたいもの];
取得 aList.get([取り出したいものの番地(0から)]); aList.get([取り出したいものの番地(0から)]); aList[取り出したいものの番地(0から)]
表 18.5.2 (具体的なコードによる)まとめ
(操作) ListTurtle LinkedList 配列
作成 ListTurtle<Turtle> aList = new ListTurtle<Turtle>(); LinkedList<Turtle> aList = new LinkedList<Turtle>(); Turtle[] aList = new Turtle[4];
挿入 aList.add(new Turtle()); aList.add(new Turtle()); aList[0] = new Turtle();
取得 aList.get(0) aList.get(0) aList[0]

18.6 練習問題

18.6.1 0655アニメーションを標準APIで作り直そう

「アニメーションを作り直そう」でListTurtleを使って作ったプログラムについて,LinkedListや配列を使って作り直してみてください.

ファイル名は「Zero655LinkedList.java」, 「Zero655Array.java」とすること.

18.6.2 大量流れ星アニメーションを標準APIで作り直そう

「大量流れ星アニメーションを作ろう」で作ったプログラムについて,LinkedListや配列を使って作り直してみてください.

ファイル名は「SuperShootingStarLinkedList.java」, 「SuperShootingStarArray.java」とすること.