以两种不同的方式对列表进行排序

时间:2016-10-24 11:57:00

标签: android sorting arraylist compare

我有一个对象列表,我希望按日期排序,并带有条件。如果end_date大于或等于今天,那么我的目标是获得一个带有升序end_date的列表,然后是一个按降序start_date排序的列表,用于过去使用end_date的objets。

我有一个这样的模型:

public class Trip implements Serializable, Comparable<Trip> {
    public int id;
    public Calendar date_begin, date_end;
}

我试过了,但它没有用,或者它太慢了。

@Override
public int compareTo(Trip trip) {
    if (date_end.getTimeInMillis() < Calendar.getInstance().getTimeInMillis() &&
        trip.date_end.getTimeInMillis() < Calendar.getInstance().getTimeInMillis()) {
        return comparePast(trip);
    } else if (date_end.getTimeInMillis() > Calendar.getInstance().getTimeInMillis() &&
            trip.date_end.getTimeInMillis() > Calendar.getInstance().getTimeInMillis()) {
        return compareCurrent(trip);
    } else {
        return date_end.compareTo(trip.date_end);
    }
}

有最简单或最快的方法吗?

2 个答案:

答案 0 :(得分:0)

使这段代码变得如此之慢的原因是许多调用Calendar.getInstance(),创建Calendar对象。如果每次比较调用一次,代码就会快得多。

但是,在单个排序运行中继续创建它们并没有多大意义。您可以设置排序可以使用的静态日历引用,也可以使用System.currentTimeMillis来获取当前时间。

答案 1 :(得分:0)

基于wvdz回答,我最终使用此方法进行比较:

@Override
public int compareTo(Trip trip) {
    long now = System.currentTimeMillis();
    if (trip.date_end.getTimeInMillis() > now && date_end.getTimeInMillis() > now) {
        return date_begin.compareTo(trip.date_begin);
    }
    return trip.date_end.compareTo(date_end);
}

它有效!