我在做作业时想出了一个小问题。
我有一个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);
}
}
老师希望我们创建一个教授课程来使用ArrayList来管理学生
public class Professor {
private List<Person> arr;
public Professor() {
arr = new ArrayList();
}
}
将大约十名学生添加到ArrayList后,我们要求对该列表进行排序。问题是,据我所知,我不能使用Collections.sort(arr),因为我声明了List&lt;人&gt;,而非List&lt;学生&gt;。
我误解了什么吗?有没有办法在这种情况下使用Collections.sort()或者我必须编写一个方法来手动对它进行排序?
他要求我们在Student类中实现Comparable接口,同时要求我们创建List&lt;人&gt;而不是List&lt;学生&gt;
编辑:非常感谢你。感谢所有的答复和评论。上面的问题已经由DOWNCAST List&lt;人&gt;列出&lt;学生&gt;答案 0 :(得分:3)
老师希望我们创建一个管理学生的教授课程 使用ArrayList
所以替换
private List<Person> arr;
by:
private List<Student> students;
通过这种方式,您可以调用Collections.sort(students)
,student
引用List
个Comparable
元素(Student
实现Comparable
接口)。
在评论后修改:
要求不符合逻辑:您必须对不可排序的内容(List<Person>
)进行排序(仅Student
实现Comparable
)。
在这些条件下,您有三种方式:
最简单,最干净的方法(如果你可以使用的话)
让Person
成为实现abstract
的{{1}}类,但要保持抽象。
这样你就不需要使用任何演员了。你可以直接调用
Comparable
Collections.sort()
强制从List<Person>
向List<Person>
投降并调用
然后List<Student>
。
执行自己的排序但是如果要使用Collections.sort()
类的compareTo()
方法,您仍然应该进行一些强制转换,因为Student
不是Person
实例。
答案 1 :(得分:0)
它不允许作为人,因为实现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());