[英]How can I use Collections.sort() if I implement Comparable interface in the subclass?
我在做作业时遇到了一个小问题。
我有一个 Person 类
public class Person {
protected String code;
protected String name;
}
还有一个叫做 Student 的子类
public class Student extends Person implements Comparable<Student>{
private double grade;
@Override
public int compareTo(Student that){
return Double.compare(grade, that.grade);
}
}
老师要我们创建一个Professional 类来使用ArrayList 来管理Student
public class Professor {
private List<Person> arr;
public Professor() {
arr = new ArrayList();
}
}
在将大约十名学生添加到 ArrayList 之后,我们被要求对该列表进行排序。 问题是,据我所知,我不能使用 Collections.sort(arr),因为我声明了它是 List< Person >,而不是 List< Student >。
我是不是误会了什么? 在这种情况下有什么方法可以使用 Collections.sort() 或者我必须编写一种方法来手动对其进行排序?
而且他要求我们在Student类中实现Comparable接口,还要求我们创建List<Person>而不是List<Student>
编辑:非常感谢。 感谢所有的答案和评论。 上述问题已通过 DownCAST List< Person > 到 List < Student > 解决
老师要我们创建一个Professional 类来使用ArrayList 来管理Student
所以更换
private List<Person> arr;
经过 :
private List<Student> students;
通过这种方式,您可以调用Collections.sort(students)
作为student
引用Comparable
元素List
( Student
实现Comparable
接口)。
评论后编辑:
该要求不是很合乎逻辑:您必须对不可排序的内容( List<Person>
)进行排序(因为只有Student
实现了Comparable
)。
在这些条件下,您有三种方式:
最简单和最干净的方式(如果您可以使用它)。
使Person
成为实现Comparable
但保持抽象的abstract
类。
这样你就不需要使用任何演员表。 您可以使用List<Person>
直接调用Collections.sort()
强制从List<Person>
向下转换到List<Student>
然后调用Collections.sort()
。
自己执行排序,但如果你想使用Student
类的compareTo()
方法,你仍然应该做一些强制转换,因为Person
不是一个Comparable
实例。
它不允许作为人,因为实现 API 所需的集合排序implements Comparable<Person>
。
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());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.