按 collections.sort 对 JodaTime 日期列表进行排序

Sort a list of JodaTime dates by collections.sort

我正在使用此算法按升序对日期列表进行排序:

Collections.sort(eventList, new Comparator<Event>() {
        @Override
        public int compare(Event e1, Event e2) {
            DateTime dt1 = new DateTime(e1.getStartDate());
            DateTime dt2 = new DateTime(e2.getStartDate());
            return dt1.isBefore(dt2)? 1:0;
        }
    });
    Event first = eventList.get(0);

我的问题是,这是最好和正确的做事方式吗?

这是第二条建议:

Collections.sort(eventList, new Comparator<Event>() {
        @Override
        public int compare(Event e1, Event e2) {
            DateTime dt1 = new DateTime(e1.getStartDate());
            DateTime dt2 = new DateTime(e2.getStartDate());
            if(dt1.isBefore(dt2))
                return -1;
            else if(dt1.isAfter(dt2))
                return 1;
            else return 0;
        }
    });
    Event first = eventList.get(0);

因为 DateTime 已经实现了 Comparable 接口,你可以这样做:

Collections.sort(eventList, new Comparator<Event>() {
    @Override
    public int compare(Event e1, Event e2) {
        DateTime dt1 = new DateTime(e1.getStartDate());
        DateTime dt2 = new DateTime(e2.getStartDate());
        return dt1.compareTo(dt2);
    }
});

有 2 个选择。

1- 使用 Comparator 比较每个 Event:

DateTime
Collections.sort(eventList, new Comparator<Event>() {
    @Override
    public int compare(Event event1, Event event2) {
        DateTime d1 = new DateTime(event1.getStartDate());
        DateTime d2 = new DateTime(event2.getStartDate());
        return d1.compareTo(d2);
    }
});

实际上,如果 getStartDate() returns 一个 java.util.Date,你不需要创建一个 DateTime 因为 java.util.Date 也实现了 Comparable.在这种情况下,您可以这样做:

Collections.sort(eventList, new Comparator<Event>() {
    @Override
    public int compare(Event event1, Event event2) {
        return event1.getStartDate().compareTo(event2.getStartDate());
    }
});

2- 使 Event 实现 Comparable:

public class Event implements Comparable<Event> {

    @Override
    public int compareTo(Event other) {
        DateTime dt1 = new DateTime(this.getStartDate());
        DateTime dt2 = new DateTime(other.getStartDate());
        return dt1.compareTo(dt2);
    }
}

Collections.sort(eventList);

在这种情况下,Collections.sort将使用Event.compareTo方法进行排序。

同样,如果getStartDate() returns一个java.util.Date,你只需要做:

public class Event implements Comparable<Event> {

    @Override
    public int compareTo(Event other) {
        return this.getStartDate().compareTo(other.getStartDate());
    }
}

选哪个?这取决于。

如果您使用备选方案 2(实现 Comparable),则意味着比较开始日期是 Event 个对象的“自然顺序”( "normal"/"usual" 排序事件的方式)。

当您想使用不同的标准(而不是“自然顺序”)进行排序时,使用 Comparator(在我看来)是一种替代方法。

但这取决于你的选择。