平成20年 春期 基本情報技術者 午後 問12(Java)
ここでは、当社の新人研修受講者に向けて、基本情報のJavaの過去問を掲載しています。
想定しているのは、NetBeansなどのIDEにコピー・ペーストしたうえで、自分の正しいと思う答えを埋めて動作を確認するという使い方です。
次の Java プログラムの説明及びプログラムを読んで,設問1,2に答えよ。
〔プログラムの説明〕
キーとそのキーに関連付けられた値をある形式に従って出力するプログラムである。
プログラム1-1は,与えられた二つの文字列をキー及びそのキーに関連付けられた 値として"キー=値"の形式(以下,プロパティ形式という)で出力する。クラス ToProperties のメソッド write の引数 key はキー,引数 value は値である。 キー及び値は英数字からなる文字列である。
プログラム1-2は,クラス ToProperties のテストプログラムである。メソッド main を実行すると,図1に示す結果が得られる。
このプロパティ形式に加えて,"<"と">"で囲まれたタグを使用する形式 (以下,タグ形式という)で出力できるようにする。 タグ形式では,キーと値の組を図2に示す形式で表し,その組をエントリという。
エントリの並びを,タグ<data> 及び </data> で囲んで出力する。
これを実現するために,次のプログラムを新たに作成し,プログラム1-1に変更を 加えた。
(1) プログラム2-1は,プロパティ形式とタグ形式の出力を 統一して扱うインタフェース KeyValueWriter を定義する。 メソッド initialize は,必要な前処理を行い, メソッド write は,引数で与えられたキーと値を出力し,メソッド complete は, 後処理を行う。出力形式は,これらのメソッドの実装で決まる。
(2) プログラム2-2は,インタフェース KeyValueWriter を 実装するクラス ToTags である。
(3) プログラム2-3は,インタフェース KeyValueWriter で定義されている 全メソッドの省略時の実装を与えるクラス KeyValueWriterAdapter である。各メソッドの 実装は,必ず空である。
(4) プログラム2-4は,プログラム1-1をクラス KeyValueWriterAdapter に適用 できるように変更したものである。
(5) プログラム2-5は,変更されたクラス ToProperties 及びクラス ToTags の出力 を検査するテストプログラムである。
全プログラムの変更後,プログラム2-5のメソッド main を実行すると,図3に示す 実行結果が得られる。
[プログラム1-1]
public class ToProperties { public void write(String key, String value) { System.out.println(key + "=" + value); } }
[プログラム1-2]
public class Test1 { public static void main(String[] args) { ToProperties writer = new ToProperties(); writer.write("color", "red"); writer.write("font", "serif"); } }
[プログラム2-1]
public interface KeyValueWriter { public void initialize(); public void write(/* a */ ); public void complete(); }
[プログラム2-2]
public class ToTags implements KeyValueWriter { public void initialize() { System.out.println("<data>"); } public void write(String key, String value) { System.out.println("<entry key=\"" + key + "\">" + value + "</entry>"); } public void complete() { System.out.println("</data>"); } }
[プログラム2-3]
public class KeyValueWriterAdapter implements KeyValueWriter { public void initialize() { } public void write(/* a */ ) { } public void complete() { } }
[プログラム2-4]
public /* b */{ public void write(String key, String value) { System.out.println(key + "=" + value); } }
[プログラム2-5]
public class Test2 { static String[][] pairs = { {"width", "200"}, {"height","120"}, {"color","blue"} }; public static void main(String[] args) { write(new ToProperties()); System.out.println("---------------"); write(new ToTags()); } private static void write(/* c */ out) { out.initialize(); for (String[] pair : pairs) { out.write(/* d */ ); } out.complete(); } }
設問1 プログラム中の/* */ に入れる正しい答えを, 解答群の中から選べ。
a に関する解答群
ア K key, V value イ Object key, Object value
ウ String key, String value エ String[] key, String[] Value
b に関する解答群
ア abstract class ToProperties extends KeyValueWriterAdapter
イ class ToProperties extends KeyValueWriterAdapter
ウ class ToProperties extends ToTags
エ class ToProperties implements KeyValueWriter
オ class ToProperties implements ToTags
c に関する解答群
ア KeyValueWriter イ KeyValueWriterAdapter
ウ Test2 エ ToProperties
オ ToTags
d に関する解答群
ア pair[0], pair[1] イ pair[1], pair[0]
ウ pair[i], pair[i + 1] エ pairs[][0], pairs[][1]
オ pairs[][1], pairs[][0]
設問2 プログラムを更に拡張して,与えられた文字列をコメントとして出力できるようにする。すなわち,プロパティ形式では与えられた文字列の先頭に "#" を 付加して出力し,タグ形式では与えられた文字列を "<!-- " 及び " -->" で囲んで出力する。例えば,与えられた文字列が "This is a comment." のとき, プロパティ形式では図4のとおりに,タグ形式では図5のとおりに出力する。 ただし,コメントとして与えられた文字列は,改行文字及び文字列 "--" を 含まないものとする。
この拡張のために,次の表に示す各コードをプログラムに追加した。各コードの追加先のプログラムとして,表中の/* */ に入れる正しい答えを,解答群の中から選べ。
解答群
ア プログラム2-1 イ プログラム2-2
ウ プログラム2-3 エ プログラム2-4