繁体   English   中英

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

[英]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元素ListStudent实现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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM