平成19年春期基本情報技術者試験午後問8、JAVA言語
- 2016/11/14
- 17:20
問題文、解答、解説の順で掲載しております。
無料から学べる講座
http://ai-light.com/itkeiei/
ニコニコチャンネル
http://ch.nicovideo.jp/ai-light
YouTubeチャンネル
https://www.youtube.com/user/ailightcom
Access・Excel倶楽部
http://ai-light.com/accessclub/
株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
***********************************************************************************************************
次の Java プログラムの説明及びプログラムを読んで,設問に答えよ。
( Java プログラムで使用する API の説明は,下記を参照してください。)
〔プログラムの説明〕
英語の月名( January,…,December )を2種類の順序に並べ替えるプログラムである。 月名は,文書の索引などを作成する場合は辞書順に並べ替える必要があるが, 日付の一部として並べ替えるときは月の順番に並んだ方が都合がよい。 並べ替えは,次のクラスメソッドを呼び出して行う。
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.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>()
■Javaプログラムで使用するAPIの説明
java.util
public interface Map<K,V>
型Kのキーに型Vの値を対応付けて保持するインタフェースを提供する。各キーは、一つの値としか対応付けられない。
メソッド
public V get(Object key)
指定されたキーに対応付けられた値を返す。
引数:key ― キー
戻り値:指定されたキーに対応付けられた型Vの値
このキーと値の対応付けがなければnull
public V put(K key,V value)
指定されたキーに指定された値を対応付けて登録する。このキーが既にほかの値と対応付けられていれば、その値は指定された値に置き換えられる。
引数:key ― キー
value ― 値
戻り値:指定されたキーに対応付けられていた型Vの古い値
このキーと値の対応付けがなければnull
java.util
public class HashMap<K,V>
インタフェースMapのハッシュを用いた実装である。キー及び値は、nullでもよい。
コンストラクタ
public HashMap()
空のHashMapを作る。
メソッド
public V get(Object key)
インタフェースMapのメソッドgetと同じ
public V put(K key,V value)
インタフェースMapのメソッドputと同じ
java.lang
public final class String
クラスStringは文字列を表す。
メソッド
public int compareTo(String anotherString)
二つの文字列を辞書順に比較した結果を整数値で返す。
二つの文字列の比較方法は[参考]に示す。
引数:anotherString ― 比較の対象となる文字列
戻り値:この文字列が引数文字列に等しいときは0
この文字列が引数文字列より辞書順で小さいときは負の値
この文字列が引数文字列より辞書順で大きいときは正の値
[参考]
二つの文字列の最初の文字から順に比較していき、最初に異なる文字が現れた文字位置がkであるとき、次式の値をメソッドの戻り値とする。
this.charAt(k) - anotherString.charAt(k)
二つの文字列において異なる文字が現れず、かつ二つの文字列の長さが異なるとき、次式の値をメソッドの戻り値とする。
this.length() -anotherString.length()
二つの文字列において異なる文字が現れず、かつ二つの文字列の長さが一致したときは0を返す。
java.util
public final class Locale
クラスLocaleは言語、国などを識別する。
フィールド
public static final Locale ENGLISH
英語を表す定数。
java.util
public class Arrays
クラスArraysは、配列を操作するクラスメソッドからなる。
メソッド
public static<T> void sort(T[] a,Comparator<? super T> c)
指定されたComparatorが規定する順序に従って、指定されたオブジェクトの配列要素を並び替える。Comparatorが規定する順序が同じ要素同士の順番は、並べ替えによって変更されない。
引数:a ― 並べ替えを行う配列
c ― 配列要素の順序付けをするComparatorのオブジェクト
public static String toString(Object[] a)
指定されたオブジェクトの配列の文字列表現を返す。
引数:a ― 配列
戻り値:aを表現する文字列
java.util
public interface Comparator<T>
あるオブジェクトの集合に対して完全な順序を規定する関数を提供するインタフェースである。
メソッド
public int compara(T o1,T o2)
引数で与えられた型Tの二つのオブジェクトを比較し、大小関係を整数値で返す。
引数:o1 ― 1番目のオブジェクト
o2 ― 2番目のオブジェクト
戻り値:o1がo2より小さいときは負の値
o1とo2が等しいときは0
o1がo2より大きいときは正の値
***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/
ニコニコチャンネル
http://ch.nicovideo.jp/ai-light
YouTubeチャンネル
https://www.youtube.com/user/ailightcom
Access・Excel倶楽部
http://ai-light.com/accessclub/
株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
***********************************************************************************************************
********************************************************************************
解答
答 aエ 答 bア 答 cイ 答 dウ
********************************************************************************
解説
「(1) クラス NameComparator は,引数で与えられた文字列を小文字の文字列に変換し, クラス String のメソッド compareTo を呼び出して比較した結果を返すメソッドを実装している。」という説明と、プログラム1を見比べる。
「引数で与えられた文字列を小文字の文字列に変換」という部分は
s1.toLowerCase(Locale.ENGLISH)に該当することがわかる。
Locale、ENGLISHに関してはAPIの説明にもあるので、そちらをご参考ください。
return ls1.compareTo(ls2);
は、APIの説明より、ls1の辞書順がls2より小さいときは負の値を、
ls1の辞書順がls2より大きいときは正の値を返すことがわかる。
「(2) クラスValueComparatorは,引数で与えられた文字列(月名)を 月の値(例えば,Aprilは4)に変換し,月の値で比較した結果を返すメソッドを実装している。」という説明より、プログラム2はインタフェース Comparator を実装するクラスである。
また、APIの説明よりComparator<T>のTは、compare(T o1, T o2)メソッドの引数の型を指定している。よって、プログラム2のcompareメソッドの引数はString型であることから、a の解答はエとなる。
Tは、Generics(ジェネリックス)という。この部分はクラス名を指定するが、要素として格納できる値をここで指定したクラスのオブジェクトである。
map.put(monthNames[i], i + 1)の部分で、プログラム内の上段の説明の通り、月名と月の値を対応付ける処理である。よってbの部分のfor文は月数分の12回ループすればよい。よって、bの解答は、アとなる。
map.putのputメソッドはAPIの説明にあるので、その部分をご参考ください。配列変数名.lengthで配列の長さを取得できる。
{ c }
問題文より、クラスValueComparatorのcompareメソッドは月の値で比較し結果を返す必要がある。それには、map.getを使って月の値を取得して比較する必要がある。
map.getに関してはAPIの説明より引数で渡されたキーに対応づけられた値を返す。
さらに、NameComparator のcompareToメソッドから、引数s1,s2でs1<s2のときに負の値を、s1>s2の時には正の値を返す必要がある。よって、cの解答はイとなる。
String[] names2 = names1.clone()でname1オブジェクトをname2にコピーする。
Arrays.sort(names2, new NameComparator())ではAPIの説明よりnames2のデータをNameComparator()が規定する順序で並べ替えを行う。
ちなみにdは同様にして、解答はウとなる。
参考文献
ジェネリックスはなぜ必要か
http://java.keicode.com/lang/generics-why-generics.php
cloneメソッド
http://java.keicode.com/lang/clone.php
参考:平成19年 春期 基本情報技術者試験午後 問08
***********************************************************************************************************
無料から学べる講座
http://ai-light.com/itkeiei/
ニコニコチャンネル
http://ch.nicovideo.jp/ai-light
YouTubeチャンネル
https://www.youtube.com/user/ailightcom
Access・Excel倶楽部
http://ai-light.com/accessclub/
株式会社アイライト公式HP
http://www.ai-light.com/
(Access・Excelでシステム開発会社を探されている法人様はこちら)
***********************************************************************************************************
- 関連記事
-
- 平成20年春期基本情報技術者試験午後 問8、JAVA言語 (2017/04/05)
- 平成19年春期基本情報技術者試験午後問12、JAVA言語 (2016/12/02)
- 平成19年春期基本情報技術者試験午後問8、JAVA言語 (2016/11/14)