2013-10-02 6 views
0

Я использую BlueJ для проекта. Вот мой код: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, я пытался просто вызвать Comparator внутри самого метода sort() - я чувствую, что я пробовал все, и все же STILL не работает.

Всякий раз, когда я пытаюсь скомпилировать его, он всегда выделяет мою часть .sort. Я чувствую, что мне не хватало мест, чтобы пойти за советом по этому вопросу.

Я также прочитал другие вопросы здесь, в stackoverflow. Я уже через час занимаюсь серфингом через эти страницы и до сих пор не знаю. Я не знаю, где я ошибся. Кажется, это прекрасно.

Тот, кто может помочь в этом, будет полностью оценен. (Вы поможете мне спать раньше, как только я это сделал XD.)

-

ой, на всякий случай, вот другие классы в программе.

компаратор интерфейс

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

класса Song

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"; 
} 
} 

Runner класс

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

Эта ошибка во время компиляции или во время выполнения? Можете ли вы сказать, в какой строке ошибка? –

+0

ошибка появляется всякий раз, когда я пытаюсь скомпилировать код. Он выделяет часть «.sort» этой строки: «Collections.sort (playlist, t)»; –

+0

сообщение об ошибке в основном говорит вам, что вы передаете два аргумента в 'sort', но второй не является компаратором. –

ответ

1

Вам не нужно создавать собственный интерфейс компаратора, у Java уже есть один.Что вам нужно, чтобы построить объекты интерфейса Comparator Java и передать их в 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()); 

Удостоверьтесь, что вы также удалили свой собственный интерфейс компаратора.

+0

ahh! Теперь он скомпилирован.: D Спасибо за это! XD Теперь я буду продолжать делать работа программы.: P tho Я хотел спросить (если вообще когда-либо), моя программа не работала, потому что код был избыточным или что-то еще? Вы упомянули, что мне не нужно создавать собственный интерфейс Comparator для Java, уже есть. которые также участвуют в как мой код не будет компилироваться в первую очередь? ^^; –

+0

Хорошая точка! Я проигнорировал, что использовал свой собственный интерфейс. –

+0

Да, проблема в том, что Collections.sort должен быть передан объект, который реализует интерфейс сравнения по умолчанию Java. Поскольку вы указали свой собственный интерфейс, также называемый Comparable, ваши компараторы реализовали это вместо стандартного Java, поэтому Collections.sort не был принят приемлемым параметром. – Ina

0

вы с reating SongByTitle, SongByArtist, SongByAlbum, SongByYear классы внутри конструктор SongSorter().

Чтобы устранить эту проблему, вам необходимо создать 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{ 

    } 
} 
+0

На самом деле это был мой предыдущий код, прежде чем я его подстраивал, чтобы посмотреть, не повлияет ли вставка классов внутри или снаружи. Я попытался скомпилировать его еще раз, по-прежнему та же ошибка .. :( –

0

я игнорирую, если это ошибка в копировании/вставке кода или на самом деле здесь, но и в коде вы вставили в вашем вопросе вы объявляете Классы компараторов внутри конструктора. Таким образом, класс не существует, когда вы пытаетесь их использовать.

Вы должны извлечь эти классы:

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> { ... } 
} 

Является ли это ваше дело?

+0

нет, мне интересно, почему метод sort() не компилируется. Я ранее клал классы за пределы класса SongSorter, но он еще не скомпилировал :( –

+0

Вы можете попробовать вызвать метод sort() следующим образом: 'Collections. sort()' –

+0

Я также пробовал это раньше, но это не сработало :(У все же была такая же ошибка –

Смежные вопросы