クラスライブラリ基礎

演習問題

解答は

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

問題1

教科書「明解 Javaによるアルゴリズムとデータ構造」のサンプルプログラム(p.187 List 6-1など)は、 配列の要素である値をキーとして、それ自身を並び替えるものであった。 それを参考に、 リストに入っているオブジェクトを並び替えるプログラムを作成したい。

オブジェクトの持つ int の値の属性で並び替えるプログラムを作成しなさい。 用いるアルゴリズムは単純交換ソート (バブルソート) の最初のサンプルプログラム(List 6-1)のものでかまわないが、 違うアルゴリズムでもよい。 main メソッドのあるクラスのクラス名は MusicSortByRating とする。

リストの要素は Music クラスのオブジェクトとし、 Music クラスの属性 rating の降順(大きい順)でソートするものとする。

配列の i 番目の要素に対する参照や代入を、 ArrayList に対する操作(=メソッド)に置き換えることになる。

ArrayList のメソッドにはいろいろあるが、 ここでは index (何番目か)を指定して参照や上書きをするので、 get と set が利用できる。

import java.util.*;

class MusicSortByRating {
    public static void main(String[] args) {
        ArrayList<Music> list = new ArrayList<Music>();

        list.add(new Music("Tour de France (Radio Version)", "Kraftwerk", 5));
        list.add(new Music("Tour de France (Kling Klang Analog Mix)", "Kraftwerk", 5));
        list.add(new Music("Tour de France (Remix Francois K.)", "Kraftwerk", 4));
        list.add(new Music("Let's Get Out Of This Country", "Camera Obscura", 5));
        list.add(new Music("Lemon Juice And Paper Cuts", "Camera Obscura", 4));
        list.add(new Music("Return To Send Her", "Camera Obscura", 4));
        list.add(new Music("Soon", "My Bloody Valentine", 5));
        list.add(new Music("Glider", "My Bloody Valentine", 4));
        list.add(new Music("Don't Ask Why", "My Bloody Valentine", 5));
        list.add(new Music("Off Your Face", "My Bloody Valentine", 4));

        // Collections クラスを使わずに自前でソート
        sort(list);

        for(Music music : list)
            System.out.println(music.getTitle() + " by " + music.getArtist() +
                               " (" + music.getRating() + ")");
    }

    // Music オブジェクトのリストをソート
    private static void sort(ArrayList<Music> list) {

        // ここを考える

    }

    // リストの要素を交換 (アルゴリズムによっては不要)
    private static void swap(ArrayList<Music> list, int index1, int index2) {

        // ここを考える

    }
}

class Music {
    private String title;
    private String artist;
    private int rating;
    public Music(String title, String artist, int rating) {
        this.title = title;
        this.artist = artist;
        this.rating = rating;
    }
    public String getTitle() {
        return title;
    }
    public String getArtist() {
        return artist;
    }
    public int getRating() {
        return rating;
    }
}

問題2

問題1のプログラムをもとに、 Music クラスに Comparable インタフェースを実装し、 それを利用してソートをするようにプログラムを変更しなさい。 ただし、rating の降順でソートすることは変わらないものとする。

自前の sort メソッドを、 Comparable インタフェースが実装されたオブジェクトの並べ替えができるように変更すること (もちろん Collections.sort メソッドは使わない)。 ソートのアルゴリズムは問題1と同じでよい。

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

問題3 (任意)

問題2のプログラムを、 アーティスト名の辞書順でソートするよう変更しなさい。 ただし、同一アーティスト名の場合にはタイトル名の辞書順となるようにすること。

ソートのアルゴリズムは、問題1、問題2とは異なるものを採用すること。 単純選択ソートなど、この授業では扱っていないものでもかまわない。

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