1

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

4

2 回答 2

1

在这段代码中:

Comparator<Song> compare = new Song.compareArtist();

Song.compareArtist您正在从静态内部类实例化。此错误消息说它找不到此类。为此,您必须以这种方式更改您的 Song 类:

class Song{

  public static class compareArtist<T> implements Comparator<T> {

    @Override
    public int compare(Object o1, Object o2) {
        // TODO Auto-generated method stub
        return 0;
    }

  }

}
于 2012-09-25T03:47:23.620 回答
0

您的声明:

Comparator<Song> compare = new Song.compareArtist();

表示在 class中有命名compareArtist的内部类Song。但我认为你只想使用compareArtist在 class中命名的方法SearchByArtistPrefix。如果是这样,您应该按照以下方式进行操作,并使用匿名内部类。

一、删除compareArtist方法

二、实现Comparator接口

Comparator<Song> compare = new Comparator<Song>(){

    public int compareTo(Song anotherSong){
        //Implement your compare logic here
    }

};
于 2012-09-25T03:47:57.940 回答