平成30年 秋期 基本情報技術者 午後 問11
問11 Java次の Java プログラムの説明及びプログラムを読んで,設問1,2に答えよ。 〔プログラムの説明〕 図1のように,文書の書式を表すひな形に置換表を適用して,出力文書を得るプログラムである。 図1 ひな形に置換表を適用して出力文書を得る例 (1)ひな形は,0 個以上の置換指示と,0 個以上のそのまま出力される置換指示以外の 部分が連なるテキストである。 置換指示は,キー名称を < と > で囲ったものである。ひな形中で,< と > は, 置換指示としてキー名称を囲う用途にだけ使用できる。 (2)置換表は,キー名称とこれに対応する文字列の並びとの組みを一つ以上記述したテキストであり, それぞれの組みは,次の形式で記述する。 文字列の並びには,置換に用いる文字列(以下,置換用文字列という)を二重引用符で 囲んだものを一つ以上記述する。置換用文字列を二つ以上記述するときは,コンマで区切る。 例えば,置換用文字列が二つである場合は,次の形式で記述する。 A 置換表のキー名称に対応する文字列の並びに含まれる置換用文字列が二つ以上あるときは, 各置換用文字列の間に改行を挟んだ上で,並び順に連結してできる文字列で置換される。 置換表中のキー名称明細に対応する文字列の並びには,置換用文字列として メモリ ; 5,ØØØ 円 HDD;9,ØØØ 円( は改行)に置換される。 クラス Replacer は,置換指示を表す。 クラス PassThrough は,置換指示以外の部分を表す。 クラス Template は,ひな形をフラグメントのリストとして保持する。メソッド apply は,ひな形に置換表を適用して,出力文書を文字列で返す。置換表には, このひな形に含まれるキー名称とそれに対応する文字列の並びが含まれているものとする。 クラス ReplacementTableParser のメソッド parse は,置換表を表す文字ストリームから, キー名称とそれに対応する文字列の並びのマップを構築して,返す。 置換表に誤りはないものとする(プログラムは省略)。 クラス TemplateTester はテスト用のプログラムである。テキストファイル template.txt が図1のひな形と同じ内容であって,テキストファイル replacementTable.txt が図1の置換表と同じ内容であるとき, 実行結果は図1の出力文書と同じになる。 〔プログラム1〕 import java.util.List; import java.util.Map; public interface Fragment { String replace(Map<String, List<String>> table); }〔プログラム2〕 import java.util.List; import java.util.Map; public class Replacer a Fragment { final String key; Replacer(CharSequence cs) { key = cs.toString(); } public String replace(Map<String, List<String>> table) { return String.join("\n", table.get(key)); }〔プログラム3〕
import java.util.List,
import java.util.Map;
public class PassThrough a Fragment {
final String str;
PassThrough(CharSequence cs) { str = cs.toString(); }
public String replace(Map<String, List<String>> table) {
return str;
}
}
〔プログラム4〕
import java.io.I0Exception; import java.io.Reader; import java.util.ArrayList; import java.util.List; public class TemplateParser { static public Template parse(Reader reader) throws I0Exception { StringBuiLder buf = new StringBuilder(); List<Fragment> fragmentList = new ArrayList<>(); int c; while ((c = reader.read()) >= 0) { switch (c) { case '<' : fragmentList.add(new b ); buf = new StringBuilder(); break; case '>' : fragmentList.add(new c ); buf = new StringBuilder(); break; default : buf.append((char) c); } } fragmentList.add(new PassThrough(buf)); return d; } }〔プログラム5〕
import java.util.List;
import java.util.Map;
public class Template {
List<Fragment> fragmentList;
TempLate(List<Fragment> fragmentList) {
this.fragmentList = fragmentList;
}
public String apply(Map<String, List<String>> table) {
StringBuilder sb = new StringBuilder();
for (Fragment fragment : fragmentList) {
sb.append(fragment.replace( e ));
}
return sb.toString();
}
}
〔プログラム6〕
import java.io.FileReader; import java.io.I0Exception; import java.io.Reader; import java.util.List; import java.util.Map; public class TemplateTester { public static void main(String... args) throws IOException { try { Reader tReader = new FileReader("template.txt"); Reader rReader = new FileReader("replacementTable.txt") ) { Template template = TemplateParser.parse(tReader); Map<String, List<String>> table = ReplacementTableParser.parse(rReader); System.out.print(template.apply(table)); } } }
a に関する解答群 エ PassThrough(c) オ Replacer(buf) カ Replacer(c) ウ new Template(fragmentList) エ new Template(reader) ウ sb エ table
f に関する解答群 イ buf.append((char) c) ウ buf.append((char) c); break エ buf.append((char) reader.read()) オ buf.append((char) reader.read()); break
[←前の問題] [次の問題→] [問題一覧表] [分野別] [基本情報技術者試験TOP ]
©2004-2024 情報処理試験.jp
|
プライバシーポリシー・著作権・リンク
|
お問合わせ
| ||||