配列のバイナリ検索でコンパレータを使用しようとすると、奇妙なエラーが発生します。このエラーは、「compareArtist を型に解決できません」と述べており、次のコードで Eclipse によってスローされます。
Comparator<Song> compare = new Song.compareArtist();
別のコンピューターでコードを試してみましたが、エラーは解決しませんが、いくつかの検索を行って、Eclipse で発生する可能性のあるバグへの参照を見つけました。
また、compare メソッド (この場合は compareArtist) の大文字化に関しても同様の問題を発見しました。メソッド名の最初の単語が大文字になっている例を見たことがありますが、メソッド名は伝統的に小文字で始まるというのが私の理解でした。大文字と小文字を変更して実験しましたが、何も変わりませんでした。
クラスが正しいパッケージをインポートしない場合、このエラーへの参照も見つかりました。問題の両方のクラスに java.util をインポートしました。これにより、私の知る限り、コンパレータを使用できます。
私は、宿題の割り当てによると、それがあるべき場所である "Song" クラスだけでなく、バイナリ検索呼び出しを持つクラス内で compareArtist メソッドを書くことを実験しました。それに応じてコンストラクターを変更しましたが、問題は解決しません。
最後に、Song クラスに Comparator を実装し、「compare」という独自のメソッドを作成して、Comparator の比較メソッドをオーバーライドしようとしました。これは同じエラーを返します。同じことを行ういくつかの例を見つけた後、「比較」とは異なる方法でコンパレーターメソッドを呼び出すことに移りました。
コンパレータを使用する二分探索を呼び出すクラスに関連するコードを次に示します。このコードには、compareArtist メソッドのローカル バージョンもあります。現在呼び出されていませんが、このメソッドのコードは、呼び出し元のクラス Song のコードと同じです。
アドバイスと洞察をありがとう。
import java.io.*;
import java.util.*;
public class SearchByArtistPrefix {
private Song[] songs; // keep a direct reference to the song array
private Song[] searchResults; // holds the results of the search
private ArrayList<Song> searchList = new ArrayList<Song>(); // hold results of search while being populated. Converted to searchResults array.
public SearchByArtistPrefix(SongCollection sc) {
songs = sc.getAllSongs();
}
public int compareArtist (Song firstSong, Song secondSong) {
return firstSong.getArtist().compareTo(secondSong.getArtist());
}
public Song[] search(String artistPrefix) {
String artistInput = artistPrefix;
int searchLength = artistInput.length();
Song searchSong = new Song(artistInput, "", "");
Comparator<Song> compare = new Song.compareArtist();
int search = Arrays.binarySearch(songs, searchSong, compare);
Song クラスのコード:
import java.io.FileNotFoundException;
import java.util.*;
public class Song implements Comparable<Song> {
private String artist, title, lyrics;
private static int compareCounter = 0;
public Song(String artistName, String songTitle, String songLyrics) {
this.artist = artistName;
this.title = songTitle;
this.lyrics = songLyrics;
}
public String getArtist() {
return artist;
}
public void setArtist(String artist) {
this.artist = artist;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getLyrics() {
return lyrics;
}
public void setLyrics(String lyrics) {
this.lyrics = lyrics;
}
public static int getCounter() {
return compareCounter;
}
public static void setCounter(int compareCounter) {
Song.compareCounter = compareCounter;
}
public int compareTo(Song secondSong) {
String secondArtist = secondSong.getArtist();
String secondTitle = secondSong.getTitle();
compareCounter++;
if (!this.artist.equals(secondArtist)) {
return this.artist.compareToIgnoreCase(secondArtist);
} else {
return this.title.compareToIgnoreCase(secondTitle);
}
}
public int compareArtist (Song firstSong, Song secondSong) {
return firstSong.getArtist().compareTo(secondSong.getArtist());
}
クラスの最後に main() メソッドもありますが、これは内部のテスト コードを提供するだけで、目前の問題には関係ありません。