如果我在子类中实现 Comparable 接口,如何使用 Collections.sort()?



我在做作业时遇到了一个小问题。

我有一个人员类

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,而不是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());

最新更新