<?xml version="1.0" encoding="utf-8"?><!DOCTYPE article  PUBLIC '-//OASIS//DTD DocBook XML V4.4//EN'  'http://www.docbook.org/xml/4.4/docbookx.dtd'><article><articleinfo><title>つながったオブジェクトを表示する</title><revhistory><revision><revnumber>16</revnumber><date>2010-11-17 00:30:43</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>15</revnumber><date>2010-11-15 12:38:11</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>14</revnumber><date>2010-11-15 01:05:55</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>13</revnumber><date>2010-11-15 01:02:10</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>12</revnumber><date>2010-11-15 00:45:33</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>11</revnumber><date>2010-11-14 13:46:34</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>10</revnumber><date>2010-11-14 13:36:03</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>9</revnumber><date>2010-11-14 13:18:33</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>8</revnumber><date>2010-11-14 12:59:26</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>7</revnumber><date>2010-11-13 12:52:37</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>6</revnumber><date>2010-11-13 12:28:28</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>5</revnumber><date>2010-11-13 03:00:16</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>4</revnumber><date>2010-11-13 02:54:25</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>3</revnumber><date>2010-11-13 02:50:00</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>2</revnumber><date>2010-11-13 02:48:13</date><authorinitials>masahiko</authorinitials></revision><revision><revnumber>1</revnumber><date>2010-11-12 13:33:53</date><authorinitials>masahiko</authorinitials></revision></revhistory></articleinfo><section><title>つながったオブジェクトを表示する</title><para>オブジェクトの操作を行うまえに、表示のためのメソッドを作っておきます。 </para><!--rule (<hr>) is not applicable to DocBook--><section><title>１つのオブジェクトを表示する</title><para>オブジェクトのアドレス(と種類)を表示するには、 オブジェクトを指している変数の値をprintすればよい。 </para><para>ここで </para><itemizedlist><listitem override="none"><screen><![CDATA[System.out.println(a);]]></screen></listitem></itemizedlist><para>の代わりに </para><itemizedlist><listitem override="none"><screen><![CDATA[a.show();]]></screen></listitem></itemizedlist><para>と書けるようにするには、つぎのようなshowメソッドを定義すればよい。 </para><itemizedlist><listitem override="none"><screen><![CDATA[void show()
{
        System.out.println(this);
}]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>どこも参照していないときの値</title><para>Chainクラスのインスタンスはこのような形をしています。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%81%A4%E3%81%AA%E3%81%8C%E3%81%A3%E3%81%9F%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B?action=AttachFile&amp;do=get&amp;target=chain2.png"/></imageobject><textobject><phrase>chain2.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>変数nextがどこも参照していないときは、どんな値をとればよいのでしょうか。 </para><para>この値は </para><itemizedlist><listitem override="none"><para>null </para></listitem></itemizedlist><para>と決められており、オブジェクト型の変数が作られたときは、 nullで自動的に初期化されます。 </para><para>次のようなプログラムを実行して確かめることができます。 </para><itemizedlist><listitem override="none"><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><token><![CDATA[public]]></token><![CDATA[ ]]><token><![CDATA[static]]></token><![CDATA[ ]]><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[main]]></methodname><![CDATA[(]]><methodname><![CDATA[String]]></methodname><![CDATA[[] ]]><methodname><![CDATA[args]]></methodname><![CDATA[)]]>
<![CDATA[{]]>
<![CDATA[        ]]><methodname><![CDATA[Chain]]></methodname><![CDATA[ ]]><methodname><![CDATA[a]]></methodname><![CDATA[;]]>
<![CDATA[        ]]><methodname><![CDATA[a]]></methodname><![CDATA[ = ]]><token><![CDATA[new]]></token><![CDATA[ ]]><methodname><![CDATA[Chain]]></methodname><![CDATA[();]]>
<![CDATA[        ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[println]]></methodname><![CDATA[(]]><methodname><![CDATA[a]]></methodname><![CDATA[.]]><methodname><![CDATA[next]]></methodname><![CDATA[);]]>
<![CDATA[}]]>
</programlisting></listitem></itemizedlist><para>実行すると </para><itemizedlist><listitem override="none"><screen><![CDATA[null]]></screen></listitem></itemizedlist><para>と表示されます。 </para><!--rule (<hr>) is not applicable to DocBook--></section><section><title>つながったオブジェクトを表示する</title><para>showAllという名前のメソッドを作成します。 </para><para>変数aがChainインスタンスを指しており、 そのインスタンスの変数nextがまた別のChainインスタンスを指しているような場合に </para><itemizedlist><listitem override="none"><screen><![CDATA[a.showAll();]]></screen></listitem></itemizedlist><para>とすることで、つながっているChainインスタンスをすべて表示するものです。 </para><itemizedlist><listitem><para>Chainインスタンスがつながっている個数は決まっていません。 </para></listitem><listitem><para>一番後ろのChainインスタンスの変数nextの値はnullになっています。 </para></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>showAllメソッド内での処理を考える</title><para>いくつものインスタンスを表示するためには、 変数を使ってインスタンスをたどっていく必要があります。 </para><itemizedlist><listitem override="none"><para>このために 変数 c を使うことにします。 </para></listitem></itemizedlist><para>1. 先頭のインスタンスを表示。 </para><itemizedlist><listitem override="none"><para>cが先頭のインスタンスを指している場合です。 </para></listitem><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%81%A4%E3%81%AA%E3%81%8C%E3%81%A3%E3%81%9F%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B?action=AttachFile&amp;do=get&amp;target=chain7.png"/></imageobject><textobject><phrase>chain7.png</phrase></textobject></inlinemediaobject> </para></listitem><listitem override="none"><para>cが指しているインスタンスを表示するには、１つのオブジェクトを表示するメソッドshow()を使えばよい。 </para><screen><![CDATA[c.show();]]></screen></listitem></itemizedlist><para>2. ２番目のインスタンスに移る。 </para><itemizedlist><listitem override="none"><para>先頭のインスタンスの処理(表示)が終わったら、c が次のインスタンスを指すように修正します。 </para></listitem><listitem override="none"><para>上の図から次の図になるようにcの値を修正します。 </para></listitem><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%81%A4%E3%81%AA%E3%81%8C%E3%81%A3%E3%81%9F%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B?action=AttachFile&amp;do=get&amp;target=chain8.png"/></imageobject><textobject><phrase>chain8.png</phrase></textobject></inlinemediaobject> </para></listitem><listitem override="none"><para>c.nextが指していたものを、cが指すようにすればよいので次のように書けます。 </para><screen><![CDATA[c = c.next;]]></screen></listitem></itemizedlist><para>3. 繰り返しの内容。 </para><itemizedlist><listitem override="none"><para>したがってインスタンスがつながっているときは、1,2の処理を繰り返して行えばよいと考えられる。 </para><screen><![CDATA[while (条件)
{
        c.show();
        c = c.next;
}]]></screen></listitem></itemizedlist><para>4. いちばん後ろのインスタンスの処理。 </para><itemizedlist><listitem override="none"><para>3で考えた繰り返しの内容を、いちばん後ろのインスタンスで行った場合にどうなるか考えます。 </para></listitem><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%81%A4%E3%81%AA%E3%81%8C%E3%81%A3%E3%81%9F%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B?action=AttachFile&amp;do=get&amp;target=chain9.png"/></imageobject><textobject><phrase>chain9.png</phrase></textobject></inlinemediaobject> </para></listitem><listitem><para>c.show(); </para><itemizedlist><listitem override="none"><para>cが指している(いちばん後ろの)インスタンスが表示されます。 </para></listitem></itemizedlist></listitem><listitem><para>c = c.next; </para><itemizedlist><listitem override="none"><para>いちばん後ろのインスタンスのnextには値<emphasis role="strong">null</emphasis>が入っています。 </para></listitem><listitem override="none"><para>c.nextにnullが入っていたので、代入が行われると次のようになります。 </para></listitem></itemizedlist></listitem><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%81%A4%E3%81%AA%E3%81%8C%E3%81%A3%E3%81%9F%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B?action=AttachFile&amp;do=get&amp;target=chain10.png"/></imageobject><textobject><phrase>chain10.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist><para>5. 繰り返しの条件を考える。 </para><itemizedlist><listitem override="none"><para>上で考えたことから繰り返しの条件は次のようになる。 </para><itemizedlist><listitem><para>cがインスタンスを指していれば処理を続ける。 </para></listitem><listitem><para>cがnullなら処理を終わる。 </para></listitem></itemizedlist></listitem><listitem override="none"><para>これを書き加えると繰り返し部分はこのようになる。 </para><screen><![CDATA[while (c != null)
{
        c.show();
        c = c.next;
}]]></screen></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>showAllメソッドを書く</title><para>次の処理を書き加えて完成。 </para><itemizedlist><listitem override="none"><para>変数 c の初期化 </para></listitem><listitem override="none"><para>最初に ( を表示 </para></listitem><listitem override="none"><para>最後に ) を表示 </para><programlisting format="linespecific" language="java" linenumbering="numbered" startinglinenumber="1"><token><![CDATA[void]]></token><![CDATA[ ]]><methodname><![CDATA[showAll]]></methodname><![CDATA[()]]>
<![CDATA[{]]>
<![CDATA[        ]]><methodname><![CDATA[Chain]]></methodname><![CDATA[ ]]><methodname><![CDATA[c]]></methodname><![CDATA[;]]>

<![CDATA[        ]]><methodname><![CDATA[c]]></methodname><![CDATA[ = ]]><token><![CDATA[this]]></token><![CDATA[;]]>
<![CDATA[        ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[println]]></methodname><![CDATA[(]]><phrase><![CDATA["("]]></phrase><![CDATA[);]]>
<![CDATA[        ]]><token><![CDATA[while]]></token><![CDATA[ (]]><methodname><![CDATA[c]]></methodname><![CDATA[ != ]]><symbol><![CDATA[null]]></symbol><![CDATA[)]]>
<![CDATA[        {]]>
<![CDATA[                ]]><methodname><![CDATA[c]]></methodname><![CDATA[.]]><methodname><![CDATA[show]]></methodname><![CDATA[();]]>
<![CDATA[                ]]><methodname><![CDATA[c]]></methodname><![CDATA[ = ]]><methodname><![CDATA[c]]></methodname><![CDATA[.]]><methodname><![CDATA[next]]></methodname><![CDATA[;]]>
<![CDATA[        }]]>
<![CDATA[        ]]><methodname><![CDATA[System]]></methodname><![CDATA[.]]><methodname><![CDATA[out]]></methodname><![CDATA[.]]><methodname><![CDATA[println]]></methodname><![CDATA[(]]><phrase><![CDATA[")"]]></phrase><![CDATA[);]]>
<![CDATA[}]]>
</programlisting></listitem></itemizedlist><!--rule (<hr>) is not applicable to DocBook--></section><section><title>正しく動作するか考える</title><para>変数aが次のようなオブジェクトを参照しているときに </para><itemizedlist><listitem override="none"><para>a.showAll() </para></listitem></itemizedlist><para>が呼ばれた場合の動作を追ってみましょう。 </para><itemizedlist><listitem override="none"><para><inlinemediaobject><imageobject><imagedata fileref="http://ei-www.hyogo-dai.ac.jp/~masahiko/moin.cgi/%E3%81%A4%E3%81%AA%E3%81%8C%E3%81%A3%E3%81%9F%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B?action=AttachFile&amp;do=get&amp;target=chain6.png"/></imageobject><textobject><phrase>chain6.png</phrase></textobject></inlinemediaobject> </para></listitem></itemizedlist></section></section></article>