我正在使用 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更改为List,我试着在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 );
}
}
答案 0 :(得分: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界面。
答案 1 :(得分:0)
您在SongSorter()构造函数中创建SongByTitle,SongByArtist,SongByAlbum,SongByYear类 。
要解决此问题,您需要创建SongByTitle,SongByArtist,SongByAlbum,SongByYear类外部 SongSorter()构造函数。
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{
}
}
答案 2 :(得分: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> { ... }
}
这是你的事吗?