クラスライブラリ基礎

演習問題

解答は

に提出しなさい。クラスファイル (〜.class) は提出不要。 提出は gFTP 等の ftp ソフトを用いて行うこと。

問題1

ArrayList と LinkedList で共通のメソッドを調べ、 その中で、速度に差が出るであろうメソッドを挙げよ。 理由も述べること。 ファイル名は List.txt とする。

問題2

学籍番号と得点を属性とする学生オブジェクトを考える。 この学生オブジェクトを管理する方法として、
  1) 学籍番号順に ArrayList に追加する、
  2) 学籍番号をキー、該当する学生オブジェクトを値とする HashMap を用意する、
の2つの方法を考える。以下のそれぞれの処理に向いている のはどちらか答えなさい。理由も述べること。
  a) 学籍番号順に全員の得点を処理
  b) 学籍番号を指定して該当者の得点を確認
ファイル名は ListAndMap.txt とする。

問題3

Music クラスのオブジェクトを要素とするリストの中から、 指定された曲名を持つオブジェクトを線形探索で探すプログラムを作成する。 以前と異なり、今回は番兵法(教科書「明解」pp.80-81)を使って作成しなさい。

なお、曲名が同一のオブジェクトが複数ある場合には、 先頭のオブジェクトが見つかればよいものとする。

main メソッドのあるクラスのクラス名は SequentialSearchSentinel とする。

import java.util.*;

class SequentialSearchSentinel {
    public static void main(String[] args) {
        ArrayList<Music> songs = new ArrayList<Music>();
        songs.add(new Music("Life Begins At The Hop", "XTC", 235));
        songs.add(new Music("Burning With Optimism's Flame", "XTC", 264));
        songs.add(new Music("Love At First Sight", "XTC", 190));
        songs.add(new Music("Respectable Street", "XTC", 231));
        songs.add(new Music("No Language In Our Lungs", "XTC", 299));
        songs.add(new Music("This Is Pop", "XTC", 169));
        songs.add(new Music("Scissors Man", "XTC", 289));
        songs.add(new Music("Towers Of London", "XTC", 323));
        songs.add(new Music("Battery Brides", "XTC", 438));
        songs.add(new Music("Living Through Another Cuba", "XTC", 209));
        songs.add(new Music("Generals And Majors", "XTC", 268));
        songs.add(new Music("Making Plans For Nigel", "XTC", 269));
        songs.add(new Music("Are You Receiving Me?", "XTC", 198));

        // 全曲表示
        for(Music music: songs)
            System.out.println(music);
        System.out.println();

        // 曲名をキー入力
        System.out.print("Song name:");
        Scanner stdIn = new Scanner(System.in);
        String songName = stdIn.nextLine();

        // 線形探索
        Music song = sequentialSearch(songs, songName);

        // 結果表示
        if (song == null)
            System.out.println("Not Found: " + songName);
        else
            System.out.println("Found: " + song.getTitle() + " by " + song.getArtist() + ".");
      }

    // 線形探索 (戻り値: 見つかったらそのオブジェクト、見つからなかったら null)
    static Music sequentialSearch(ArrayList<Music> list, String songName) {
	// 番兵作成
	Music sentinel = new Music(songName, "dummy", 0);
	list.add(sentinel);
	// 結果のオブジェクトを持つ変数
	Music result = null;

        // ここを考える

        return result;
    }
}

class Music {
    private String title;
    private String artist;
    private int time;        // [秒]

    public Music(String title, String artist, int time) {
	  this.title = title;
	  this.artist = artist;
	  this.time = time;
    }
    public String getTitle() {
	  return title;
    }
    public String getArtist() {
	  return artist;
    }
    public int getTime() {
	  return time;
    }
    public String toString() {
	  return title + " by " + artist + " (Time: " + time + " sec)";
    }
}

なお、拡張 for ループは内部で Iterator クラスの hasNext() メソッドを呼び出しており、 毎回終端かどうかを確認しているので番兵法にならない。 Iterator およびその next() メソッドを使いつつ、 hasNext() メソッドは使わずに繰り返しをするとよい。

ヒント: 2つの変数の参照先オブジェクトが同一であるかを確認するには、 変数1 == 変数2、でよい。

問題4

第2週の問題4において RankedAlbumListener を作成した。 このプログラムは Album を評価値の順に並べることができるが、 その他の順序で並べることはできない。 しかし、アーティスト名の辞書順で並んでほしいことも、時にはある。 そこで、複数の基準でソートすることができるプログラムにしたい。

上記の2つの基準で並び替えることができるプログラムを作成しなさい。 main メソッドの中で、2通りのソート結果を表示すればよい。 なお、評価値やアーティスト名が等しい場合の動作は任意とする。

第2週の問題4においては「Comparable、Comparator のどちらを使用してもよい」 とされていたが、今回は Comparator を使用すること。 Comparator インタフェースを実装したクラスを複数用意するとよい。

main メソッドのあるクラスのクラス名は、 AlbumListenerInSeveralWays とすること。