我在以下行中出错:
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);
}
}
答案 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<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(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;
}