【问题标题】:BlueJ - 'no suitable method found' for sort methodBlueJ - 排序方法的“找不到合适的方法”
【发布时间】:2013-10-02 16:34:58
【问题描述】:

我正在为一个项目使用 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)

我已经在网上搜索了一个小时左右我可以做些什么来解决这个问题;我已将播放列表从 ArrayList 更改为仅列表,我尝试仅在 sort() 方法本身中调用 Comparator - 我觉得我已经尝试了所有方法,但它仍然不起作用。

每当我尝试编译它时,它总是会突出显示我的“.sort”部分。我觉得我已经没有地方可以去寻求有关此事的建议了。

我还阅读了有关 stackoverflow 的其他问题。我已经浏览这些页面一个小时了,但仍然没有任何线索。我不知道我哪里弄错了。在我看来很好。

谁能在这方面提供帮助,我们将不胜感激。 (等我搞定了,你会帮我早点睡。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 );
    }
}

【问题讨论】:

  • 那个错误是在编译时还是在执行时?你能说出错误所在的那一行吗?
  • 每当我尝试编译代码时都会出现错误。它突出显示了这一行的“.sort”部分:“Collections.sort(playlist, t);”
  • 错误消息基本上是在告诉您您将两个参数传递给sort,但第二个不是比较器。
  • @JanDvorak 哦,好吧......所以我为实现 Comparator 类而创建的类不起作用? D:

标签: java sorting arraylist bluej


【解决方案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 接口。

【讨论】:

  • 啊!现在它编译了。 :D 谢谢你! XD 现在我将继续使程序正常工作。 :P 我想问一下(如果有的话),我的程序是否因为代码冗余或其他原因而无法运行?您提到我不必为 Java 构建自己的 Comparator 接口已经有一个。这也是我的代码一开始无法编译的部分原因吗? ^^;
  • 是的,问题在于 Collections.sort 需要传递一个实现 Java 默认 Comparable 接口的对象。因为您已经指定了自己的接口,也称为 Comparable,所以您的 Comparator 正在实现它而不是 Java 的默认值,所以 Collections.sort 没有被传递一个可接受的参数。
【解决方案2】:

您在 SongSorter() 构造函数创建了 SongByTitle、SongByArtist、SongByAlbum 和 SongByYear 类。

要解决此问题,您需要在 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{

   } 
}

【讨论】:

  • 这实际上是我的代码在我调整它之前的样子,看看将类放在里面还是外面会有所不同。我尝试再次编译它,仍然是同样的错误.. :(
【解决方案3】:

如果这是您的代码的复制/粘贴中的错误,或者真的在这里,我会忽略,但是在您粘贴到问题中的代码中,您在构造函数中声明了 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> { ... }
}

这是你的事吗?

【讨论】:

  • 不,我想知道为什么 sort() 方法无法编译。我之前已经将类放在 SongSorter 类之外,但它仍然没有编译: (
  • 您可以尝试像这样调用 sort() 方法:Collections.&lt;Song&gt;sort()
  • 我之前也尝试过,但没有成功:(仍然有同样的错误
  • 我忽略了你正在使用你自己的界面;-)。对不起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-02
  • 2017-03-12
  • 1970-01-01
  • 2017-07-09
相关资源
最近更新 更多