【问题标题】:How can I use Collections.sort() if I implement Comparable interface in the subclass?如果我在子类中实现 Comparable 接口,如何使用 Collections.sort()?
【发布时间】:2017-12-05 21:23:27
【问题描述】:

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

我有一个 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,而不是 List。

我是不是误会了什么?在这种情况下有什么方法可以使用 Collections.sort() 还是我必须编写一个方法来手动对其进行排序?

并且他要求我们在Student类中实现Comparable接口,还要求我们创建List而不是List

编辑:非常感谢。感谢所有的答案和评论。 DOWNCAST List 到 List

已解决上述问题

【问题讨论】:

  • 如果您打算以学生特有的方式对学生进行排序,那么比较器肯定属于该类。
  • 您的课程Person 很可能是一个abstract 课程。然后你可以声明Person 来实现Comparable,但实际代码只在Person 的子类中实现Comparable
  • @Timothy Truckle 我同意你的看法。有了这些要求,这似乎是最合乎逻辑的方式。
  • 这样想吧:如果你的List&lt;Person&gt; 中有一个Teacher,你会如何根据列表中的Students 对其进行排序?

标签: java sorting arraylist


【解决方案1】:

老师希望我们创建一个教授类来管理学生 使用数组列表

所以替换

private List<Person> arr;

作者:

private List<Student> students;

通过这种方式,您可以调用Collections.sort(students),因为student 指的是Comparable 元素中的ListStudent 实现了Comparable 接口)。


评论后编辑

要求不是很合乎逻辑:您必须对不可排序的东西 (List&lt;Person&gt;) 进行排序(因为只有 Student 实现 Comparable)。

在这些条件下,你有三种方式:

  • 最简单、最干净的方法(如果你可以使用的话)。
    Person 设为实现Comparableabstract 类,但将其抽象化。
    这样,您就不需要使用任何演员表。你可以直接调用 Collections.sort()List&lt;Person&gt;

  • 强制从List&lt;Person&gt; 向下转换为List&lt;Student&gt; 并调用 然后Collections.sort()

  • 自己进行排序,但如果您想使用Student 类的compareTo() 方法,因为Person 不是Comparable 实例,您仍然应该进行一些强制转换。

【讨论】:

  • 感谢您的回答。问题是他强迫我们使用 List。真的很烦全班
  • 不客气。这个要求真的不合逻辑。我更新了 3 个命题。
  • 非常感谢@davidxxx。它适用于 downcast 选项。
  • 非常欢迎您 :) FIY:如果答案符合您的要求,您应该接受答案,而不是编辑您的问题以添加此信息。
【解决方案2】:

不允许作为人,因为实现implements Comparable&lt;Person&gt; 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());

【讨论】:

    猜你喜欢
    • 2022-07-08
    • 1970-01-01
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2017-03-21
    • 1970-01-01
    • 2020-08-01
    相关资源
    最近更新 更多