pafuイーランスクール 学んでできる

メニューへ戻る

Java 応用問題9 平成14年度秋期問12 解説

問題の確認

解説
(問題概要)
CSV形式のデータをタグ形式(XML)に変換するプログラムです。
(前提知識)
●アルゴリズム
●StringBuffer
●オーバーライド
(解説)
問題文の説明が2ページありますが、簡単に言うと、CSV形式をタグ形式に変換するものです。入力例と出力例があるので、概要は掴みやすいかと思います。この処理には、CSVparserを継承したTaggedDateGeneratorクラスで実行されています。ここでスーパークラス(CSVparser)で処理が定義されていないメソッドについて、オーバーライドして処理を記述しています。まず、このオーバーライドされたメソッド5個についての処理内容の把握が必要です。続いて、どのようにして変換しているかを読み取る必要があります。これは、プログラム1の「parse()メソッド」のWhile文の「reader.read()」の部分に注目します。ここでコメント文があり、「readerから1文字読み込む」とあり、これを前提にアルゴリズムを解読する必要があります(問題文にも明記されています)。解答欄は、すべてこの1文字ずつ読み込んだ際にタグ形式にどう変換しているか問われています。実際は、StringBufferを使用して1文字ずつ文字を追加して、「,」「/n」の時、タグへ変換して、StringBufferの内容をクリアーしています。ここを読み取る必要があります。
(a)
ここは、プログラム2のオーバーライドされた「valueメソッド」に注目して下さい。引数が同じで、かつ、中身のない処理が記述されたものが正解となります。よって、ここは、「イ」となります。
(b)
「endOfRecord」の初期化の部分です。これは、switch文の「default」に注目します。このswitch文は、CSVファイルのレコードについて1文字ずつ読み込んだ際の文字を判断して適切な変換処理を行っています。defaultの条件に引っかかるのは、「,」「/n」以外の場合です。ここでは、1文字をStringBufferへ追加する必要があります。従って、解答欄「e」の処理を実行出来るように初期化が必要です。よって、「true」をセットする必要があります。正解は「ウ」となります。
(c)
ここでは、「,」が出現した時の処理です。これは、「StringBufferの内容をタグへ変換する」処理となります。プログラム2の「valueメソッド」で処理する必要がある訳です。valueメソッドの第一引数は、String型です。よって、「buf.toString()」となります。次に第二引数は、int型です。解答欄を確認すると「fieldNumber」の違いのみです。これは、valueメソッドで、name、email、phoneの判断で使用しています。よって、初期値が0ですから、「+1」する必要があります。よって、正解は、「エ」となります。確認のため、「/n」の時も「c」を実行しています。これは、レコードの終端に達した時の処理です。ここで、fieldNumberを0に初期化していることで確認出来ます。
(d)
ここでは、「/n」が出現した時の処理です。3番目のタグのphoneをタグへ変換して、「</person>」を出力する必要があります。よって、プログラム2の「endRecordメソッド」に注目します。int型の引数があり、正解は「ク」となります。
(e)
これは、endOfRecordの初期値が「true」のため、一番最初に実行される処理です。While文の前に「startDocument()」がありますから、startRecordの処理になります。ここでは、タグは、レコードごとにidでカウントしています。これは、「recordNumber」の変数を使用していることに気づいて下さい。初期値が0ですから、カウントする必要があります。よって正解は「エ」となります。
(f)
ここでは、StringBufferへ1文字、追加していく部分です。その前に、endOfRecordをfalseにしています。つまり、これをfalseにしないと、再度、(e)の処理が実行されてしまいます。(e)の処理は、新しいレコードに達した時のみに処理を行います。確認すると、「/n」の処理の時、trueへセットしています。これは、レコードの終端に達したからです。また、ここでは、if文で、falseの時のみ処理を行っています。これは、安全性のための条件です。(f)の解答は、StringBufferへ1文字、追加する訳ですから、「append」を使用します。引数は、「ch」となり、正解は、「ウ」となります。そして、while文のループを脱出した時に、endDocument()メゾッドで「</addressbook>」が出力されます。
(最後に)
この問題は、どちらかと言うと「アルゴリズムとStringBufferについて」を問われている問題です。ファイル処理については、問題文に説明がありますので、知らない方でも、ここで理解できるかと思います。処理の流れは、1文字ずつ読み込み、文字を追加して、「,」や「/n」の時にどのような処理をすれば良いかを問われています。解答する場合は、「a-b-e-f-c-d」の順に解答するのが一番、理解しやすいかと思います。

pafu 投稿

メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる