尝试在数组上使用带有二进制搜索的比较器时出现一个奇怪的错误。错误指出“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);
歌曲类代码:
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() 方法,但它只提供内部测试代码,与手头的问题无关。