基本情報H23秋 問11Java 解説

プログラムの流れ

住所録のエントリを追加したり、削除したり、検索を行う住所管理プログラムです。

コードが長くてよくわからない場合

まずはmainメソッド内を見てみる
たくさんのクラスに分かれていて流れがつかみにくい場合はmainメソッド内の処理を見てみるとよいと思います。

AddressBookクラスのaddrbookにNameクラスとAddressクラスをセットで追加していることがわかります。

設問1 a. ア

Nameクラス内の入れ子クラスCriteriaが何をimplementsしているかという問題です。


Criteriaクラスの説明を探すと
「Name及びAddressは、それぞれ入れ子クラスCriteriaを定義し、そのCriteriaを検索条件とするインターフェースSearchableを実装する。」
とあります。

Criteriaは検索条件であり、検索条件に関するインターフェースを実装(implements)するといえそうです。

このプログラムにおいてインターフェースは2つあります。

1.SearchCriteria : 検索条件を示すデータ型
2.Searchable : 実装するクラスが検索条件を与えて検索可能であることを示す

この2つのうち合致するのはSearchCriteriaでしょう。

設問1 b. オ

AddressBookクラスのmeetsAnyOfメソッドの処理に関する問題です。

meetsAnyOfメソッドの説明を探すと
「引数で与えられたインターフェースSearchCriteriaのどれかに合致するエントリの集合を返す。」
とあります。

つまり、住所録に入っている情報(book)のうち、引数で渡した情報(criteria)に合致する情報(entry)をまとめた集合(result)として返してあげるメソッドということになります。

meetsメソッドは、ここでは条件に合致すればtrueが返ってくるメソッドと思っておけばよいです。

つまり、ここでは返す集合(result)に条件に合致する情報(entry)を追加する処理を問われていることになります。

よって答えは、result.add(entry)になります。

設問1 c. キ

AddressBookクラスのmeetsAllOfメソッドの処理に関する問題です。

meetsAllOfメソッドの説明を探すと
「引数で与えられたインターフェースSearchCriteriaの全てに合致するエントリの集合を返す。」
とあります。

つまり、引数で渡した情報(criteria)全てに合致する情報(entry)をまとめた集合(result)として返してあげるメソッドということになります。

1つ注意点としては、このメソッドの返す集合(result)にはすでに住所録に入っている情報(book)がすべて入った状態になっています。

つまり、ここでは条件に合致しない情報(entry)をresultから削除する処理を問われていることになります。

よって答えは、result.remove(entry)になります。

設問1 d. オ e. ア

Entryクラスのmeetsメソッドの処理に関する問題です。

meetsメソッドの説明を探すと
「引数で与えられたSearchCriteriaの具体的な型によって、nameまたはaddrのメソッドmeetsを呼び出し、このAddressBook.Entryのインスタンスが引数で指定された検索条件に合致するかどうか調べる。」
とあります。

...よくわからない場合はとりあえずmeetsメソッドの中身を見てみましょう。

meetsメソッド内部では
if (criteria instanceof Name.Criteria)ならname.meetsと
if (criteria instanceof [ e ].Criteria)なら.addr.meetsに
分かれています。

これが上の説明であった「SearchCriteriaの具体的な型によって...」の部分です。

以上より、dに関しては、引数には、Name.CriteriaとAddress.Criteria共通のクラス(インタフェース)を指定することになるので、答えはSearchCriteriaになります。

eに関しては、上のif文がヒントとなり、答えはAddressになります。

設問2

クラスTestにおいて、addrbookの全エントリを取得する方法に関する問題です。

解答群を見ると、meetsAllOfとmeetsAnyOfが使われているので、それぞれのメソッドで全エントリを取得する方法を選べばよいです。

➀meetsAllOfメソッド
設問1 cで説明したように「引数で与えられたインターフェースSearchCriteriaの全てに合致するエントリの集合を返す」メソッドです。

➁meetsAnyOfメソッド
設問1 bで説明したように「引数で与えられたインターフェースSearchCriteriaのどれかに合致するエントリの集合を返す。」メソッドです。

➀,➁ともにエントリに共通の条件を引数に与えてあげればすべての集合を取得できそうです。

ここで、Nameが一致する条件(meetsの中身)は何なのか見ていきます。

・Name
meetsメソッドの中身は、criteria.areMetBy(this)なので、areMetByメソッドの中身を見ます。
areMetByメソッドの中身は、(familyNameがnullか一致する)かつ(givenNameがnullか一致する)となっています。

つまり、familyNameとgivenNameがそれぞれnullか一致であればtrueが返ってきそうです。

回答群をそれぞれ見ていきます。

ア、エ:new Name.Criteria("","") ×:nullではなく空文字なので一致しない
イ、オ:new Name.Criteria(null,null) 〇:両方nullなのでtrue
ウ、カ:null ×:引数はSearchCriteria型である必要がある  

よって答えはイ、オです。







この記事が気に入ったらサポートをしてみませんか?