我有一个由ArrayList
个对象组成的Student
。这些对象包含名字,姓氏,实验室成绩,项目成绩,考试成绩和总成绩。我正在尝试编写一个函数,根据其总成绩对Student
中的ArrayList
个对象进行排序。
这是我的学生班:
public class Student {
// fields
private String firstname;
private String lastname;
private int labgrade;
private int projectgrade;
private int examgrade;
private int totalgrade;
// constructor
public Student(String firstname, String lastname, int labgrade,
int projectgrade, int examgrade) {
this.firstname = firstname;
this.lastname = lastname;
this.labgrade = labgrade;
this.examgrade = examgrade;
this.totalgrade = labgrade + projectgrade + examgrade;
}
// method
public String toString() {
String s = firstname + " " + lastname + " has a total grade of "
+ totalgrade;
return s;
}
public int compareTo(Student s) {
return (totalgrade = s.totalgrade);
}
这就是我尝试做的事情:
private ArrayList<Student> arraylist = new ArrayList<Student>();
public void SortStudent() {
Collections.sort(arraylist);
}
但这不起作用,因为它说它只适用于List
而不是ArrayList
。有任何帮助来修复我的SortStudent
方法吗?
答案 0 :(得分:4)
ArrayList
是List
,问题是Student
未实现Comparable
,而您没有定义compareTo
方法,我需要使用sort
中的Collections
方法
你可以做类似的事情:
public class Student implements Comparable<Student> {
//... the rest of the class
public int compareTo(Student s) {
return Integer.compare(this.grade, s.grade);
}
}
另一个选择是使用方法为Collections.sort(List<T>, Comparator<? super T> c)
的lambda表达式,您不需要实现Comparable
:
public void sortStudent() {
Collections.sort(arraylist, (s1, s2) -> Integer.compare(s1.grade, s2.grade));
}
答案 1 :(得分:1)
Collections.sort
仅适用于实现Comparable的类型:
public static <T extends Comparable<? super T>> void sort(List<T> list) {...}
在这种情况下,使用Comparable<...>
实施Student
是一个糟糕的选择,因为排序标准可能会发生变化。例如有时您希望按名字排序,有时候也可以按姓氏排序。
List<...>
有一个排序方法需要Comparator
,你可以使用它:
private ArrayList<Student> arraylist = new ArrayList<Student>();
...
public void SortStudent() {
arraylist.sort((x, y) -> Integer.compare(x.totalgrade, y.totalgrade));
}
答案 2 :(得分:-1)
class Student implements Comparable{
int rollno;
String name;
int grade;
Student(int rollno,String name,int grade){
this.rollno=rollno;
this.name=name;
this.grade=grade;
}
public int compareTo(Object obj){
Student st=(Student)obj;
if(grade==st.grade)
return 0;
else if(grade>st.grade)
return 1;
else
return -1;
}