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

时间:2017-07-02 13:50:16

标签: java sorting arraylist

我在做作业时想出了一个小问题。

我有一个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;

2 个答案:

答案 0 :(得分:3)

  

老师希望我们创建一个管理学生的教授课程   使用ArrayList

所以替换

private List<Person> arr;

by:

private List<Student> students;

通过这种方式,您可以调用Collections.sort(students)student引用ListComparable元素(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());