解答は
- ホスト: earth.mlab.im.dendai.ac.jp
- ディレクトリ: /home/submit/JavaLib/[今日の日付]/[学籍番号]
に提出しなさい。クラスファイル (〜.class) は提出不要。 提出は gFTP 等の ftp ソフトを用いて行うこと。
ArrayList の要素を線形探索するプログラムを作成しなさい。 ArrayList の要素は Music クラスのオブジェクトとし、 曲名をキーとして探索するものとする。
同一の曲名を持つ Music オブジェクトが複数存在する場合には、 先頭の 1 つが見つかればよいものとする。
main メソッドのあるクラスのクラス名は SequentialSearch とする。
import java.util.*;
class SequentialSearch {
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) {
// ここを考える
}
}
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)";
}
}
問題1のプログラムをもとに、 同一の曲名を持つ Music オブジェクトが複数存在する場合には、 そのすべてを見つけるように変更しなさい。 メソッド sequentialSearch の戻り値を変更すること。
main メソッドのあるクラスのクラス名は SequentialSearchAll とする。
ArrayList の要素を2分探索するプログラムを作成しなさい。 ArrayList の要素は Music クラスのオブジェクトとし、 曲名をキーとして探索するものとする。
2分探索を行う時点で、リストは曲名の辞書順でソートされているものとする。
同一の曲名を持つ Music オブジェクトが複数存在する場合には、 そのいずれか 1 つが見つかればよいものとする。
main メソッドのあるクラスのクラス名は BinarySearch とする。
import java.util.*;
class BinarySearch {
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));
// ソート
Collections.sort(songs);
// 全曲表示
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();
// 2分探索
Music song = binarySearch(songs, songName);
// 結果表示
if (song == null)
System.out.println("Not Found: " + songName);
else
System.out.println("Found: " + song.getTitle() + " by " + song.getArtist() + ".");
}
// 2分探索 (戻り値: 見つかったらそのオブジェクト、見つからなかったら null)
static Music binarySearch(ArrayList<Music> list, String songName) {
// ここを考える
}
}
class Music implements Comparable<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 int compareTo(Music another) {
// titleの辞書順
return title.compareTo(another.getTitle());
}
public String toString() {
return title + " by " + artist + " (Time: " + time + " sec)";
}
}