welcome: please sign in
location: "つながったオブジェクトを表示する"の差分
3と16のリビジョン間の差分 (その間の編集: 13回)
2010-11-13 02:50:00時点のリビジョン3
サイズ: 470
編集者: masahiko
コメント:
2010-11-17 00:30:43時点のリビジョン16
サイズ: 4683
編集者: masahiko
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 1: 行 1:
#acl All:
行 7: 行 6:
オブジェクトのアドレス(と種類)を表示するには、
オブジェクトを指している変数の値をprintすればよい。

ここで
行 8: 行 11:
 System.out.println(a); System.out.println(a);
行 12: 行 15:
 a.show(); a.show();
行 21: 行 24:
----
=== どこも参照していないときの値 ===
Chainクラスのインスタンスはこのような形をしています。
 . {{attachment:chain2.png}}
変数nextがどこも参照していないときは、どんな値をとればよいのでしょうか。

この値は
 . null
と決められており、オブジェクト型の変数が作られたときは、
nullで自動的に初期化されます。

次のようなプログラムを実行して確かめることができます。
 {{{#!java
public static void main(String[] args)
{
 Chain a;
 a = new Chain();
 System.out.println(a.next);
}
 }}}

実行すると
 {{{
null
 }}}
と表示されます。
----
=== つながったオブジェクトを表示する ===

showAllという名前のメソッドを作成します。

変数aがChainインスタンスを指しており、
そのインスタンスの変数nextがまた別のChainインスタンスを指しているような場合に

 {{{
a.showAll();
 }}}
とすることで、つながっているChainインスタンスをすべて表示するものです。

 * Chainインスタンスがつながっている個数は決まっていません。
 * 一番後ろのChainインスタンスの変数nextの値はnullになっています。
----
=== showAllメソッド内での処理を考える ===
いくつものインスタンスを表示するためには、
変数を使ってインスタンスをたどっていく必要があります。

 . このために 変数 c を使うことにします。

1. 先頭のインスタンスを表示。
 . cが先頭のインスタンスを指している場合です。
 . {{attachment:chain7.png}}
 . cが指しているインスタンスを表示するには、1つのオブジェクトを表示するメソッドshow()を使えばよい。
 {{{
c.show();
 }}}
2. 2番目のインスタンスに移る。
 . 先頭のインスタンスの処理(表示)が終わったら、c が次のインスタンスを指すように修正します。
 . 上の図から次の図になるようにcの値を修正します。
 . {{attachment:chain8.png}}
 . c.nextが指していたものを、cが指すようにすればよいので次のように書けます。
 {{{
c = c.next;
 }}}
3. 繰り返しの内容。
 . したがってインスタンスがつながっているときは、1,2の処理を繰り返して行えばよいと考えられる。
 {{{
while (条件)
{
 c.show();
 c = c.next;
}
 }}}
4. いちばん後ろのインスタンスの処理。
 . 3で考えた繰り返しの内容を、いちばん後ろのインスタンスで行った場合にどうなるか考えます。
 . {{attachment:chain9.png}}
 * c.show();
  . cが指している(いちばん後ろの)インスタンスが表示されます。
 * c = c.next;
  . いちばん後ろのインスタンスのnextには値'''null'''が入っています。
  . c.nextにnullが入っていたので、代入が行われると次のようになります。
 . {{attachment:chain10.png}}
5. 繰り返しの条件を考える。
 . 上で考えたことから繰り返しの条件は次のようになる。
  * cがインスタンスを指していれば処理を続ける。
  * cがnullなら処理を終わる。
 . これを書き加えると繰り返し部分はこのようになる。
 {{{
while (c != null)
{
 c.show();
 c = c.next;
}
 }}}
----
=== showAllメソッドを書く ===
次の処理を書き加えて完成。
 . 変数 c の初期化
 . 最初に ( を表示
 . 最後に ) を表示

 {{{#!java
void showAll()
{
 Chain c;

 c = this;
 System.out.println("(");
 while (c != null)
 {
  c.show();
  c = c.next;
 }
 System.out.println(")");
}
 }}}
----
=== 正しく動作するか考える ===
変数aが次のようなオブジェクトを参照しているときに
 . a.showAll()
が呼ばれた場合の動作を追ってみましょう。
 . {{attachment:chain6.png}}

つながったオブジェクトを表示する

オブジェクトの操作を行うまえに、表示のためのメソッドを作っておきます。


1つのオブジェクトを表示する

オブジェクトのアドレス(と種類)を表示するには、 オブジェクトを指している変数の値をprintすればよい。

ここで

  • System.out.println(a);

の代わりに

  • a.show();

と書けるようにするには、つぎのようなshowメソッドを定義すればよい。

  • void show()
    {
            System.out.println(this);
    }


どこも参照していないときの値

Chainクラスのインスタンスはこのような形をしています。

  • chain2.png

変数nextがどこも参照していないときは、どんな値をとればよいのでしょうか。

この値は

  • null

と決められており、オブジェクト型の変数が作られたときは、 nullで自動的に初期化されます。

次のようなプログラムを実行して確かめることができます。

  •    1 public static void main(String[] args)
       2 {
       3         Chain a;
       4         a = new Chain();
       5         System.out.println(a.next);
       6 }
    

実行すると

  • null

と表示されます。


つながったオブジェクトを表示する

showAllという名前のメソッドを作成します。

変数aがChainインスタンスを指しており、 そのインスタンスの変数nextがまた別のChainインスタンスを指しているような場合に

  • a.showAll();

とすることで、つながっているChainインスタンスをすべて表示するものです。

  • Chainインスタンスがつながっている個数は決まっていません。
  • 一番後ろのChainインスタンスの変数nextの値はnullになっています。


showAllメソッド内での処理を考える

いくつものインスタンスを表示するためには、 変数を使ってインスタンスをたどっていく必要があります。

  • このために 変数 c を使うことにします。

1. 先頭のインスタンスを表示。

  • cが先頭のインスタンスを指している場合です。
  • chain7.png

  • cが指しているインスタンスを表示するには、1つのオブジェクトを表示するメソッドshow()を使えばよい。
    c.show();

2. 2番目のインスタンスに移る。

  • 先頭のインスタンスの処理(表示)が終わったら、c が次のインスタンスを指すように修正します。
  • 上の図から次の図になるようにcの値を修正します。
  • chain8.png

  • c.nextが指していたものを、cが指すようにすればよいので次のように書けます。
    c = c.next;

3. 繰り返しの内容。

  • したがってインスタンスがつながっているときは、1,2の処理を繰り返して行えばよいと考えられる。
    while (条件)
    {
            c.show();
            c = c.next;
    }

4. いちばん後ろのインスタンスの処理。

  • 3で考えた繰り返しの内容を、いちばん後ろのインスタンスで行った場合にどうなるか考えます。
  • chain9.png

  • c.show();
    • cが指している(いちばん後ろの)インスタンスが表示されます。
  • c = c.next;
    • いちばん後ろのインスタンスのnextには値nullが入っています。

    • c.nextにnullが入っていたので、代入が行われると次のようになります。
  • chain10.png

5. 繰り返しの条件を考える。

  • 上で考えたことから繰り返しの条件は次のようになる。
    • cがインスタンスを指していれば処理を続ける。
    • cがnullなら処理を終わる。
  • これを書き加えると繰り返し部分はこのようになる。
    while (c != null)
    {
            c.show();
            c = c.next;
    }


showAllメソッドを書く

次の処理を書き加えて完成。

  • 変数 c の初期化
  • 最初に ( を表示
  • 最後に ) を表示
       1 void showAll()
       2 {
       3         Chain c;
       4 
       5         c = this;
       6         System.out.println("(");
       7         while (c != null)
       8         {
       9                 c.show();
      10                 c = c.next;
      11         }
      12         System.out.println(")");
      13 }
    


正しく動作するか考える

変数aが次のようなオブジェクトを参照しているときに

  • a.showAll()

が呼ばれた場合の動作を追ってみましょう。

  • chain6.png

つながったオブジェクトを表示する (最終更新日時 2010-11-17 00:30:43 更新者 masahiko)