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);

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() メソッドもありますが、これは内部のテスト コードを提供するだけで、目前の問題には関係ありません。

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();

compareArtistclass で名前が付けられた内部クラスがあることを意味しSongます。compareArtistしかし、クラスで名前が付けられたメソッドのみを使用したいと思います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 に答える