平成19年 春期 基本情報技術者 午後 問08(Java)
ここでは、当社の新人研修受講者に向けて、基本情報のJavaの過去問を掲載しています。
想定しているのは、NetBeansなどのIDEにコピー・ペーストしたうえで、自分の正しいと思う答えを埋めて動作を確認するという使い方です。
次の Java プログラムの説明及びプログラムを読んで,設問に答えよ。
( Java プログラムで使用する API の説明は,IPAのPDF冊子の末尾を参照してください。)
〔プログラムの説明〕
英語の月名( January,…,December )を2種類の順序に並べ替えるプログラムである。 月名は,文書の索引などを作成する場合は辞書順に並べ替える必要があるが, 日付の一部として並べ替えるときは月の順番に並んだ方が都合がよい。 並べ替えは,次のstaticメソッドを呼び出して行う。
java.util.Arrays.sort(Object[], java.util.Comparator)
このメソッドは,引数で与えられたComparatorのインスタンスのメソッド compare を 呼び出して配列中の要素を比較し,並べ替える。 ここでは,インタフェース Comparator を実装する次の二つのクラスを定義する。
(1) クラス NameComparator は,引数で与えられた文字列を小文字の文字列に変換し, クラス String のメソッド compareTo を呼び出して比較した結果を返すメソッドを実装している。
(2) クラスValueComparatorは,引数で与えられた文字列(月名)を 月の値(例えば,Aprilは4)に変換し,月の値で比較した結果を返すメソッドを実装している。 引数の文字列は,大文字と小文字を区別しない。 月名は,Jan,Febなど,3文字の省略形を指定してもよい。
ただし,二つのクラスともメソッド compare に与えられる月名は正しいものとする。
クラス MonthNameSorter は,上記の二つの Comparator を実装したクラスを用いて,月名を並べ替える。 メソッド main を実行した結果を次に示す。
[December, July, DEC, June, April, May] [April, DEC, December, July, June, May] [April, May, June, July, December, DEC] |
[プログラム1]
import java.util.Comparator; import java.util.Locale; public class NameComparator implements Comparator<String> { public int compare(String s1, String s2) { String ls1 = s1.toLowerCase(Locale.ENGLISH); String ls2 = s2.toLowerCase(Locale.ENGLISH); return ls1.compareTo(ls2); } }
[プログラム2]
import java.util.Comparator; import java.util.Locale; import java.util.Comparator; import java.util.HashMap; import java.util.Locale; import java.util.Map; public class ValueComparator implements /* a */ { private static final String[] monthNames = { "january", "february", "march", "april", "may", "june", "july", "august", "september", "october", "november", "december" }; private static final Map<String, Integer> map = new HashMap<String, Integer>(); static { // 月名とその値(例: may → 5)が対応するようにmapを初期化する。 for (int i = 0;/* b */; i++) { // 月名と月の値を対応付ける。 map.put(monthNames[i], i + 1); // 月名の最初の3文字と月の値を対応付ける。 map.put(monthNames[i].substring(0, 3), i + 1); } } public int compare(String s1, String s2) { String ls1 = s1.toLowerCase(Locale.ENGLISH); String ls2 = s2.toLowerCase(Locale.ENGLISH); return /* c */; } }
[プログラム3]
import java.util.Arrays; public class MonthNameSorter { public static void main(String[] args) { final String[] names1 = { "December", "July", "DEC", "June", "April", "May" }; System.out.println(Arrays.toString(names1)); String[] names2 = names1.clone(); Arrays.sort(names2, new NameComparator()); System.out.println(Arrays.toString(names2)); String[] names3 = names1.clone(); Arrays.sort(names3,/* d */); System.out.println(Arrays.toString(names3)); } }
設問 プログラム中の/* */ に入れる正しい答えを, 解答群の中から選べ。
a に関する解答群
ア Comparator<int> イ Comparator<Integer>
ウ Comparator<Object> エ Comparator<String>
b に関する解答群
ア i < monthNames.length イ i <= monthNames.length
ウ i > monthNames.length エ i >= monthNames.length
c に関する解答群
ア map.get(ls1) + map.get(ls2) イ map.get(ls1) - map.get(ls2)
ウ map.get(ls1) / map.get(ls2) エ map.get(ls2) - map.get(ls1)
d に関する解答群
ア new Comparator() イ new Comparator<String>()
ウ new ValueComparator() エ new ValueComparator<String>()