我在做作业时遇到了一个小问题。
我有一个人员类
public class Person {
protected String code;
protected String name;
}
还有一个子类叫做学生
public class Student extends Person implements Comparable<Student>{
private double grade;
@Override
public int compareTo(Student that){
return Double.compare(grade, that.grade);
}
}
老师希望我们创建一个教授类来使用 ArrayList 管理学生
public class Professor {
private List<Person> arr;
public Professor() {
arr = new ArrayList();
}
}
在将大约十名学生添加到 ArrayList 后,我们被要求对该列表进行排序。问题是,据我所知,我不能使用Collections.sort(arr(,因为我声明它List
我误解了什么吗?在这种情况下,有没有办法使用 Collections.sort((,或者我必须编写一个手动排序的方法?
他要求我们在班级学生中实现可比接口,还要求我们创建列表<人员>而不是列表<学生>学生>人员>
编辑:非常感谢。感谢所有的答案和评论。上述问题已通过向下列表解决<人员>列表<学生>学生>人员>
老师希望我们创建一个教授班来管理学生 使用 ArrayList
所以更换
private List<Person> arr;
由:
private List<Student> students;
通过这种方式,你可以调用Collections.sort(students)
,因为student
引用Comparable
元素的List
(Student
实现Comparable
接口(。
评论后编辑:
这个要求不是很合乎逻辑:你必须对不可排序的东西(List<Person>
(进行排序(因为只有Student
实现Comparable
(。
在这些条件下,您有三种方法:
最简单,最干净的方法(如果您可以使用它(。
使Person
成为实现Comparable
但保持抽象的abstract
类。
这样,您无需使用任何强制转换。您可以直接调用Collections.sort()
带List<Person>
强制将向下的投射从
List<Person>
List<Student>
并调用 然后Collections.sort()
.执行排序,但如果要使用
Student
类的compareTo()
方法,您仍应执行一些强制转换,因为Person
不是Comparable
实例。
它不允许作为人,因为实现所需的集合排序implements Comparable<Person>
是 API 是。
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
一种方法如下所述,我为您提供了另一种使用Comparator
对列表进行排序的方法
class SortbyGrade implements Comparator<Student>
{
// Used for sorting in ascending order of
// roll number
public int compare(Student a, Student b)
{
return Double.compare(a.grade, b.grade);
}
}
集合排序
Collections.sort(arr, new SortbyGrade());