pafuイーランスクール 学んでできる

メニューへ戻る

Java 応用問題8 平成15年度春期問12 解説

問題の確認

解説
(問題概要)
この問題は、双方向リストのデータ構造を利用して30人の座席管理のプログラムです。問題文にもあるように双方向リストは、次の要素と前の要素のアドレスを格納しています。つまり、要素の1個が座席1つに対応するということです。
(前提知識)
●双方向リストの特徴について
●クラスについて
●オブジェクト(インスタンス)について
●型変換について
(解説)
クラスListElementについて
このクラスの読み取りが一番、重要です。問題文に「リストのヘッド(先頭)と要素の両方を表現する」とあります。つまり、このクラスは、双方向リストを管理して、リストのヘッド・各要素のいずれか1個を表現するクラスです。
クラスSeetについて
上記のクラスを継承しています。このクラスは、実際の生徒の属性である「使用者」「使用開始時間」「座席番号」の設定と取得及び、使用者の比較のメソッドより構成されております。
クラスSertManagerについて
問題文の運用規則の実装と、生徒の「席の利用」と「席の開放」のメソッドを実装しています。
(プログラム1について)
ListElement型の「prev」「next」を定義しています。コンストラクタでは、これらを「this」によって自分自身を示すようにしています。そして、次の要素、前の要素をそれぞれ「next」「prev」にしています。
リストの挿入処理についてですが、引数の要素の前に挿入する訳ですから、next=elementで、挿入する要素の次の要素は、elementとしています。次に、prev=element.prevで、挿入する要素の前の要素は、elementの前の要素としています。これによって、挿入する要素のポインタは決定します。続いて、next.prev=prev.next=?ですが、挿入する要素のポインタは決定しましたが、前後のポインタを挿入する要素に変更する必要があります。つまり、挿入する要素の次の要素のprevと挿入する要素の前の要素のnextに挿入する要素へ変更する必要があります。これは、挿入する要素である自分自身を指すようにすれば良い訳です。従って、「a」は「this」ということになります。
次にリストの要素削除処理ですが、これは、要素自体を削除しますので、next、つまり次の要素を指しているものを削除する要素の前の要素が次の要素を指すように変更します。つまり、「b」は「prev.next」となります。次のprevは、前の要素が指しているものを削除する要素の前の要素を指すように変更します。つまり、「c」は「next.prev」となります。その後、「prev=next=this」によって削除した要素が自分自身を指すようにしています(コンストラクタと同様です)。
(プロクラム2について)
これは、上記のクラスを継承して実際の座席表へ実装しています。これは、Javaのクラスの定型的な構成を取っています。つまり、3個のフィールドをprivateで定義して、そのフィールドへの値の設定と取得をpublicのメソッドで定義しています。これは、素早く読み取って下さい。
(プログラム3について)
最初の2行は、「final」があり、これは、Javaでの定数の定義です。次に「空席リスト」と「使用中リスト」をListElementクラスのオブジォクトとして定義しています。その次がこのクラスのコンストラクタです。ここでは、for文により30回ループ処理を行っています。Sertクラスのオブジォクトを作成して、これを空席リストオブジェクトの前に挿入しています。これによって30個の空席リストの双方向リストが完成します。ここでのポイントは、空席リストの「freeSerts」は「ヘッド」であるということです。
●メソッド「getFreeSert()」は、コメントがあるように、ここでは、freeSertsの次の要素を取得して比較しています。ここで等しい場合は、次の要素がヘッドのfreeSertsと同様ですから、要素がないということを示しています。ここは読み取る必要があります。
●メソッド「vacateExpiredSer(long time)」では、解答(d)を求めますが、比較の部分でleと使用中リストで等しくない時が使用中と判断しています。ここでループ処理がありません。ということは、使用リストの双方向リストの各要素にある一定の並びがあると予想できます。これを確認するためには、メソッド「checkin()」より読み取ります。ここでは、現在時刻を取得して、空席リストより空席があるかどうか調べています。Nullの時は、空席がない時です。Nullでない時は、空席がある時で、この際に「現在時刻」と「使用者」をセットして、使用中リストの前に要素を挿入しています。これによって使用中のリストの要素は、使用時間の短い順に並んでいることがわかります。これより、解答「d」は、最後の要素(1番時間を要している)を取得すれば良い訳です。従って解答は、「occupiedSerts.previousElement()」となります。
●メソッド「findUser(String userID)」は、ここでは、while文でループ処理をしています。注目すべき点は、「le = le.nextElement();」です。これより、要素の最初からループしていることが分かります。従って、解答「e」は、「occupiedSerts.nextElement()」となります。つまり、使用中リストの最初の要素からループを開始して、取得した要素(le)がヘッドと等しくない間(使用者がいる)、ループ処理を行い、leをsertへ型変換して、Sertクラスの「isUseBYメソッド」でuserIDの比較を行い、trueの場合にsertオブジォクトを返しています。
(設問2)
一人で複数の席が現在のプログラムでは可能です。これは、checkinメソッドに注目します。ここでは、無条件に使用中リストへ追加しています。よって、使用中リストをループ処理して、引数のuserIDと等しいものが存在するかどうかのチェックをcheckinメソッドの最初にする必要があります。private boolern checkuserID(String userID) { } のようなメソッドを作成すれば良いかと思います。
(最後に)
この問題は、受験者にとっては、少し難しかったものと思われます。しかし、双方向リストについて知らなくても、問題文に明記されています。後は、クラスでの実現方法について把握できれば、解答できるものと思われます。Javaには、C言語と違ってポインタという概念はありません。しかし、クラスからオブジェクトを作成した場合、オブジェクト変数には、参照が格納されて実際のオブジェクトがメモリ上に存在します。プログラム1のprevやnextがこれに相当します。このようなクラスは実際の実務では、ホテルや旅館の部屋の管理に利用することが可能です。

pafu 投稿

メニューへ戻る

pafuイーランスクール

pafuイーランスクール 学んでできる