2017-07-02 63 views
0

我在做作业的时候遇到了一个小问题。如何在子类中实现Comparable接口时如何使用Collections.sort()?

我有一个Person类

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(); 
    } 
} 

后将约10名学生添加到ArrayList中,并要求我们对该列表进行排序。问题是,据我所知,我不能使用Collections.sort(arr),因为我声明了List < Person>,而不是List < Student>。

我误解了什么吗?有没有办法在这种情况下使用Collections.sort(),或者我必须编写一个方法来手动排序呢?

他要求我们实现在类学生Comparable接口,还要求我们创建列表<人>而不是List <学生>

编辑:非常感谢你。赞赏所有的答复和评论。上述问题的解决方法是垂头丧气名单<人>列出<学生>

+0

名单如果你计划给学生排序对于学生来说特别适合,比较者肯定属于那个班级。 –

+1

你的班级'Person'很可能是一个* abstract *班级。然后你可以声明'Person'来实现'Comparable',但是要在'Person'的子类中实现'Comparable'的实际代码只有 –

+0

@Timothy Truckle我同意你的意见。有了这些要求,这似乎是最合乎逻辑的方法。 – davidxxx

回答

2

老师要我们去创造一个教授级利用的ArrayList

学生 管理所以更换

private List<Person> arr; 

通过:

private List<Student> students; 

通过这种方式,你可以调用Collections.sort(students)studentComparableList一个元素(Student实现Comparable接口)。注释后


编辑:

的要求是不是很合乎逻辑:你要排序的东西(List<Person>)是不可排序(如只Student工具Comparable)。

在论文的条件下,你有三种方式:

  • 最简单和最清晰的方式(如果你可以用它)。
    制作Personabstract类实现Comparable但保持它的抽象。
    这样你就不需要使用任何强制转换。你可以直接调用 Collections.sort()List<Person>

  • 力从List<Person>丧气到List<Student>和调用 然后Collections.sort()

  • 执行自己的排序,但你还是应该做一些类型转换,如果你想使用Student类的compareTo()方法Person不是Comparable实例。

+0

感谢您的回答。事情是他迫使我们使用名单< Person >。它真的让全班同学感到恼火 –

+0

不客气。这个要求是不合逻辑的。我更新了3个命题。 – davidxxx

+0

非常感谢@davidxxx。它适用于downcast选项。 –

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()); 
相关问题