0

プロジェクトにBlueJを使用しています。これが私のコードです:

import javax.swing.*;`
import java.awt.*;
import java.util.Collection;
import java.util.Collections;
import java.awt.event.*;
import java.util.*;
import java.util.List;

public class SongSorter extends JFrame
{
    private JPanel main, header, buttons1, buttons2, labels, texts, SongPanel;
    private JTextField Title, Artist, Album, Year;
    private JLabel credits, title, artist, album, year;
    private JButton add, shuffle, sortTitle, sortArtist, sortAlbum, sortYear;
    private JTextArea RecordsText;
    private Song s;
    private List<Song> playlist;

public SongSorter()
{
    Container c = this.getContentPane();
    c.setLayout( new FlowLayout() );
    c.setBackground( Color.BLACK );

    main = new JPanel( new BorderLayout() );
    main.setSize( 200, 200 );
    c.add( main);

    // for buttons
    header = new JPanel( new GridLayout(4, 1) );
    main.add( header, "North" );

    buttons1 = new JPanel( new FlowLayout() );
    header.add( buttons1 );

    add = new JButton( "Add" );
    shuffle = new JButton( "Shuffle" );

    buttons1.add( add );
    buttons1.add( shuffle );

    buttons2 = new JPanel( new FlowLayout() );
    header.add( buttons2 );

    sortTitle = new JButton( "Title" );
    sortArtist = new JButton( "Artist" );
    sortAlbum = new JButton( "Album" );
    sortYear = new JButton( "Year" );

    buttons2.add( sortTitle );
    buttons2.add( sortArtist );
    buttons2.add( sortAlbum );
    buttons2.add( sortYear );

    texts = new JPanel( new FlowLayout() );
    header.add( texts );

    Title = new JTextField( "Title", 10 );
    Artist = new JTextField( "Artist", 10 );
    Album = new JTextField( "Album", 10 );
    Year = new JTextField( "Year", 10 );

    title = new JLabel("Title: ");
    artist = new JLabel("Artist: ");
    album = new JLabel("Album: ");
    year = new JLabel("Year: ");

    texts.add( title );
    texts.add( Title );
    texts.add( artist );
    texts.add( Artist );
    texts.add( album );
    texts.add( Album );
    texts.add( year );
    texts.add( Year );

    // where the user will see the record of songs listed
    SongPanel = new JPanel( new GridLayout(1, 1) );
    main.add( SongPanel, "Center" );
    SongPanel.setSize(100, 100);

    RecordsText = new JTextArea();
    RecordsText.setWrapStyleWord( true );
    RecordsText.setLineWrap( true );
    RecordsText.setTabSize( 100 );
    SongPanel.add( RecordsText );

    playlist = new ArrayList<Song>();

    // sorting comparators
    final SongByTitle t = new SongByTitle();
    final SongByArtist a = new SongByArtist();
    final SongByAlbum b = new SongByAlbum();
    final SongByYear y = new SongByYear();

    // time for buttons and shit
    // add and shuffle
    add.addActionListener( new ActionListener()
        {
            public void actionPerformed( ActionEvent ae )
            {
                String t = Title.getText();
                String a = Artist.getText();
                String b = Album.getText();
                int y = Integer.parseInt( Year.getText() );

                s = new Song(t, a, b, y);
                playlist.add( s );

                RecordsText.append( s.print() );
            }
        }
    );

    shuffle.addActionListener( new ActionListener()
        {
            public void actionPerformed( ActionEvent ae )
            {
                Collections.shuffle( playlist );
                RecordsText.setText( playlist.toString() );
            }
        } );

    // sorting buttons
    sortTitle.addActionListener( new ActionListener()
        {
            public void actionPerformed( ActionEvent ae )
            {
                Collections.sort( playlist, t );
                RecordsText.setText( playlist.toString() );
            }
        } );

    sortArtist.addActionListener( new ActionListener()
        {
            public void actionPerformed( ActionEvent ae )
            {
                Collections.sort( playlist, a );
                RecordsText.setText( playlist.toString() );
            }
        } );

    sortAlbum.addActionListener( new ActionListener()
        {
            public void actionPerformed( ActionEvent ae )
            {
                Collections.sort( playlist, b );
                RecordsText.setText( playlist.toString() );
            }
        } );

    sortYear.addActionListener( new ActionListener()
        {
            public void actionPerformed( ActionEvent ae )
            {
                Collections.sort( playlist, y );
                RecordsText.setText( playlist.toString() );
            }
        } );
    }
}

class SongByTitle implements Comparator<Song>
    {
        public int compare( Song a, Song b )
        {
            return a.getTitle().compareTo( b.getTitle() );
        }
    }

    class SongByArtist implements Comparator<Song>
    {
        public int compare( Song a, Song b )
        {
            return a.getArtist().compareTo( b.getArtist() );
        }
    }

    class SongByAlbum implements Comparator<Song>
    {
        public int compare( Song a, Song b )
        {
            return a.getAlbum().compareTo( b.getAlbum() );
        }
    }

    class SongByYear implements Comparator<Song>
    {
        public int compare( Song a, Song b )
        {
            if( a.getYear() < b.getYear() ) return -1;
            else if(a.getYear() > b.getYear() ) return 1;
            else return 0;
        }
    }

そして、私はこのエラーを受け取り続けます:

no suitable method found for sort(java.util.List<Song>, SongByTitle)
    method java.util.Collections.<T>sort(java.util.List<T>,java.util.Comparator<? super T>) is not applicable
     (no instance(s) of type variable(s) T exist so that argument type SongByTitle conforms to formal parameter type java.util.Comparator<? super T>)
    method java.util.Collections.<T>sort(java.util.List<T>) is not applicable
     (cannot instantiate from arguments because actual and formal argument lists differ in length)

これを修正するために何ができるかについて、1時間ほどオンラインで検索してきました。プレイリストを ArrayList から List のみに変更しました。 sort() メソッド自体の中で Comparator を呼び出そうとしました。

コンパイルしようとすると、常に「.sort」部分が強調表示されます。その件について相談に行く場所がなくなったような気がします。

ここでスタックオーバーフローに関する他の質問も読みました。これらのページを 1 時間サーフィンしてきましたが、まだ手がかりがありません。どこで間違えたのかわからない。私には問題ないようです。

これに関して助けてくれる人は誰でも大歓迎です。(これが終わったら、早く寝れるように手伝ってくれます。XD)

--

念のため、プログラム内の他のクラスを次に示します。

コンパレータインターフェース

public interface Comparator<Song> 
{
    int compare( Song a, Song b );
}

歌のクラス

public class Song
{
    String title, artist, album;
    int year;

public Song(String t, String a, String b, int y)
{
    title = t;
    artist = a;
    album = b;
    year = y;
}

public String getTitle()
{
    return title;
}

public String getArtist()
{
    return artist;
}

public String getAlbum()
{
    return album;
}

public int getYear()
{
    return year;
}

public String print()
{
    String t = this.getTitle();
    String a = this.getArtist();
    String b = this.getAlbum();
    int y = this.getYear();

    String song = t + 
        " by " + a + "; Album: " + b + ", " + y + "\n";
    return song;
}

@Override
public String toString()
{
    return title + " by " + artist 
       + "; Album: " + album + ", " + year + "\n";
}
}

ランナークラス

public class SongRunner
{
    public static void main( String[] args )
    {
        JFrame f = new SongSorter();
        f.setSize( 200, 200 );
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.setVisible( true );
        f.setResizable( false );
    }
}
4

3 に答える 3

1

独自の Comparator インターフェイスを構築する必要はありません。Java にはすでに存在します。必要なのは、Java の Comparator インターフェイスのオブジェクトを構築し、これらを Collections.sort に渡すことです。

次のように、Song クラス内で複数のコンパレータを使用することもできます。

public class Song {

// ...

public static Comparator<Song> getAlbumComparator() {
    return new Comparator<Song>() {
        public int compare(YourClass one, YourClass two) {
            return(songA.getAlbum().compareTo(songB.getAlbum());
        }
    };
}

// Other comparators
}

次に、次のように呼び出します。

Collections.sort(playlist, Song.getAlbumComparator());

独自の Comparator インターフェイスも削除してください。

于 2013-10-02T16:59:28.777 に答える
0

SongByTitle、SongByArtist、SongByAlbum、SongByYear クラスをSongSorter() コンストラクター内に作成します。

この問題を修正するには、SongSorter() コンストラクターの外部で、SongByTitle、SongByArtist、SongByAlbum、SongByYear クラスを作成する必要があります。

public class SongSorter extends JFrame
   public SongSorter()
   {//here the problem starts
         class  SongByTitle{

        }
        class SongByArtist{

        }
        class SongByAlbum{

        }
        class SongByYear{

       } 
   }//here the problem ends
} 

修正

public class SongSorter extends JFrame
   public SongSorter()
   {
   }
   class  SongByTitle{

   }
   class SongByArtist{

   }
   class SongByAlbum{

   }
   class SongByYear{

   } 
}
于 2013-10-02T16:54:52.700 に答える
0

これがコードのコピー/貼り付けのエラーであるか、実際にここにある場合は無視しますが、質問に貼り付けたコードでは、コンストラクター内で Comparator クラスを宣言しています。このように、クラスを使用しようとするとクラスは存在しません。

このクラスを抽出する必要があります。

public class SongSorter extends JFrame
{
    ...

    public SongSorter() { ... }

    class SongByTitle implements Comparator<Song> { ... }

    class SongByArtist implements Comparator<Song> { ... }

    class SongByAlbum implements Comparator<Song> { ... }

    class SongByYear implements Comparator<Song> { ... }
}

これはあなたの問題ですか?

于 2013-10-02T16:55:25.237 に答える