Java错误eclipse对列表排序

时间:2015-10-26 10:30:45

标签: java

我在以下行中出错:

Collections.sort(l);

你能解释一下原因吗?

这是程序代码:

import java.io.*;
import java.util.*;

public class Esame{

    public static void main(String args[]) throws IOException{
        ArrayList<Studente> l=new ArrayList<Studente>();
        BufferedReader b=new BufferedReader(new InputStreamReader(System.in));
        String cognome = b.readLine();
        while(!cognome.equals("")){
            System.out.println("inserire nome");
            String nome = b.readLine();
            System.out.println("inserire matricola");
            String matricola = b.readLine();
            Studente s = new Studente(nome, cognome, matricola);
            l.add(s);
            System.out.println("inserire cognome");
            cognome = b.readLine();
        }
        b.close();
        Collections.sort(l);
        Iterator<Studente> i=l.iterator();
        PrintStream p=new PrintStream(new File("uscita.txt"));
        while(i.hasNext()){
            p.println(i.hasNext());
        }
        p.close();
    }

}

class Studente{

    protected String nome,cognome;
    protected int matricola;

    public Studente(String nome,String cognome,String matricola){
        this.nome=nome;
        this.cognome=cognome;
        this.matricola=Integer.parseInt(matricola);
    }

    public String toString(){
        return "\n NOME:  "+nome+"Cognome:  "+cognome+"MATRICOLA: "+matricola;
    }

    public int compareTo(Object x) {
         Studente p = (Studente) x;
         return cognome.compareTo(p.cognome);
    }
}

5 个答案:

答案 0 :(得分:3)

您可以implements Comparable<T>解决问题,也可以将Comparator传递给sort方法,例如:

Collections.sort(l, new Comparator<Studente>() {
            @Override
            public int compare(Studente o1, Studente o2) {
                // some kind of comparation
                return o1.matricola - o2.matricola;
            }
        });

这样您的课程就不需要实现Comparable接口

答案 1 :(得分:2)

更改

1。)在学生班中实施Comparable界面

public class Studente implements Comparable<Studente>{
}

2。)更改覆盖方法compareTo

@Override
    public int compareTo(Studente o) {
        Studente p = (Studente) o;
        return cognome.compareTo(p.cognome);
    }

来自Javadoc,

  

按照升序对指定列表按升序排序   其元素的自然排序。列表中的所有元素都必须   实现Comparable接口。此外,所有元素   list必须是可相互比较的(即,e1.compareTo(e2)一定不能   为列表中的任何元素e1和e2抛出ClassCastException。

有关详细信息,请参阅Collections#sort

答案 2 :(得分:2)

 class Studente implements Comparable&lt;Studente&gt;{

    protected String nome,cognome;
    protected int matricola;

    public Studente(String nome,String cognome,String matricola){
       this.nome=nome;
        this.cognome=cognome;
        this.matricola=Integer.parseInt(matricola);
    }

    public String toString(){
      return "\n NOME:  "+nome+"Cognome:  "+cognome+"MATRICOLA: > "+matricola;
    }

    public int compareTo(Studente x) {
       //how to compare
       return 0;
    }

你必须使你的班级实施可比。

答案 3 :(得分:1)

你的班级Studente必须实施Comparable界面才能进行排序!

否则.sort(...)不知道如何比较Studente个对象。

答案 4 :(得分:1)

只需将Arraylist更改为List

ArrayList<Studente> l=new ArrayList<Studente>();

应该是

List<Studente> l=new ArrayList<Studente>();

Collections.sort method accepts an列出and not an ArrayList`

请参阅api

来自Spec的

片段

  

按照升序对指定列表按升序排序   其元素的自然排序。列表中的所有元素都必须   实现Comparable接口。此外,所有元素   list必须是可相互比较的(即,e1.compareTo(e2)一定不能   为列表中的任何元素e1和e2抛出ClassCastException。

您的Studente课程应实施Comparable界面,以使sort能够正常使用。

Implement

中的

Comparable Studente界面

class Studente implements Comparable<Studente>{

    protected String nome,cognome;
    protected int matricola;

    public Studente(String nome,String cognome,String matricola){
        this.nome=nome;
        this.cognome=cognome;
        this.matricola=Integer.parseInt(matricola);
    }

    public String toString(){
        return "\n NOME:  "+nome+"Cognome:  "+cognome+"MATRICOLA: "+matricola;
    }

    @Override
    public int compareTo(Studente o) {
        // Logic for compare has to go here
        return 0;
    }