使用 Collections.sort 时出错

Posted

技术标签:

【中文标题】使用 Collections.sort 时出错【英文标题】:Error using Collections.sort 【发布时间】:2017-04-17 03:14:00 【问题描述】:

我正在尝试对事件的结束时间进行排序。在我的应用程序类中,endTime 位于我的 Event 类中,由我的 Time 类中的小时和分钟定义。

在我的事件类中添加了implements Comparable<Event>,虽然我得到了The type Event must implement the inherited abstract method Comparable<Event>.compareTo(Event)。我尝试了快速修复add unimplemented methods,但收效甚微。

ArrayList<Event> events = new ArrayList <Event>();

Time endTime = new Time((startTime.getHour()), (startTime.getMinute() + duration));

在我的时间课程中,我使用 compareTo

public class Time implements Comparable<Time> 

@Override
public int compareTo(Time time)
    if (this.getHour() > time.getHour())
        return 1;
    else if (this.getHour() == time.getHour())
        return 0;
    else 
        return -1;

当我尝试在我的应用程序类中对 arrayList 进行排序时,我得到了

The method sort(List<T>) in the type Collections is not applicable for the arguments (ArrayList<Event>)

                Collections.sort(events);

【问题讨论】:

Event 是否实现了Comparable&lt;Event&gt;? (不清楚为什么Time 类是相关的) 我的事件应该实现Comparable&lt;Event&gt; 吗?它没有compareTocompareTo 位于 Time 类中。 是的。 Collections.sort 怎么知道如何比较它的实例?它不知道对endTime 进行排序,除非你告诉它。 【参考方案1】:

Collections.sort() 是:

      public static <T extends Comparable<? super T>> void sort(List<T> list) 
            list.sort(null);
            

所以,应该使 Event 实现具有可比性而不是 Time。

【讨论】:

【参考方案2】:

如果您想根据事件时间事件集合进行排序,那么 Event 类应该实现 Comparable 接口并使用 Time 类中的 compare 方法。

只需将 Comparable 接口的实现添加到 Event 类并比较其中的 Time 对象:

public class Event implements Comparable<Event>

    //removed fields and methods

    @Override
    public int compareTo(Event event)
       return this.getTime().compareTo(event.getTime());
    


【讨论】:

以上是关于使用 Collections.sort 时出错的主要内容,如果未能解决你的问题,请参考以下文章

jdk8 Collections#sort究竟做了什么

Collections.sort 使用啥设计模式?

通过Java排序List集合的元素的几种方法

为啥 collections.sort 在 Java 中按比较器排序时会抛出不支持的操作异常?

Mybatis使用Criteria标准查询数据库没有order by排序方法时,使用Java的Collections.sort()进行排序

Mybatis使用Criteria标准查询数据库没有order by排序方法时,使用Java的Collections.sort()进行排序