オブジェクトを繋ぐ
クラス型の変数をポインタとして使って、オブジェクトを繋いでみた(図1)
図1
図1のクラス型Nodeは、以下のように宣言されている。
class Node {
Node p = null;
String data;
}
Node型のクラス内に同じNode型の変数 p を置いて、p によって次のNode型のオブジェクトを指し示す。使用例として、以下のプログラムを作成した。
package Chain;
import java.io.BufferedReader;
import java.io.InputStreamReader;
//
// ノード用クラス型
//
class Node {
Node
p = null; // 次のノードを指し示すポインタとして使用
String
data; // 文字列データを格納
}
public class Chain {
public
static void main(String args[]){
Node
s_node; // 繋がれたノードのチェインの先頭を指し示す
Node
t_node; // 現在のノードを指し示す
t_node
= s_node = null; // 初期値は null
int
ck_s = 1; // 最初のノードが作成されば 0 に設定
try{
//
// キーボードからの読み込み用ストリーム cin の設定
//
BufferedReader
cin = new BufferedReader(new InputStreamReader(System.in));
while(true){
//
// データの読み込み
//
System.out.print("Data
= ");
String
str = cin.readLine();
if
(str.length() == 0) break; // 読み込んだ文字列が空 "" であれば、入力の終了
if
(ck_s == 1){ // 最初のノードの作成
t_node
= s_node = new Node(); // 作成された最初のノードを指し示す
ck_s
= 0; // 最初のノードが作成されたので、0 を設定
}
else {
t_node.p
= new Node(); // 次のノードを作成して、変数 p が指し示すようにする
t_node
= t_node.p; // 作成した次のノードを t_node が指し示すようにする
}
t_node.data
= str; // 新しく作成されたノードの data に読み込んだ文字列を設定
t_node.p
= null; // 新しく作成されたノードの p に null を設定して、繋がったノードの最後尾であることを示す
}
}
catch(Exception
e){
System.out.println("Exception
is thrown.");
System.out.println(e.toString());
return;
}
System.out.println("\nInput
data...");
if
(s_node != null){ // s_node
の値が null のときは、入力データがない
t_node
= s_node; // ノードの繋がりの先頭を t_node が指し示すようにする
while(true){
System.out.println(t_node.data); // ノードのデータ data の出力
if
(t_node.p == null) break; // t_node
が最後のノードを指し示していれば
while 文から抜け出す
t_node
= t_node.p; // t_node
に、次のノード t_node.p を設定
}
}
System.out.println("<End
of Data>");
}
}
上のパッケージファイルは、圧縮ファイルsrc_chain.zipとして用意した。圧縮ファイルsrc_chain.zipのダウンロード・解凍したのものの利用についてはこのウェブサイトで説明している。
図2に実行例を示す。
図2
「Data =」と聞いてきたら、文字列を打ち込む。何も文字キーを打たないで、Enterキーを押すと、入力の終了とみなされ、それまで入力した文字列が出力される。