У меня есть список объектов, которые я хочу отсортировать по дате с условием. Моя цель - получить список с возрастающей end_date, если end_date больше или равно, чем сегодня, а затем список, упорядоченный по убыванию start_date для объектов с end_date в прошлом.

У меня такая модель:

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

Есть ли самый простой или самый быстрый способ?

0
Maxime 24 Окт 2016 в 14:56

2 ответа

Лучший ответ

Что делает этот код таким медленным, так это многочисленные вызовы Calendar.getInstance() для создания объектов Calendar. Код уже был бы намного быстрее, если бы вы вызывали это один раз для сравнения.

Однако нет особого смысла создавать их за один прогон сортировки. Вы можете установить статическую ссылку на Календарь, которую может использовать сортировка, или использовать System.currentTimeMillis для получения текущего времени.

0
wvdz 24 Окт 2016 в 12:01

Основываясь на ответе 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);
}

И это работает!

0
Community 23 Май 2017 в 10:32