2016-10-24 3 views
0

У меня есть список объектов, которые я хочу сортировать по дате, с условием. Моя цель - получить список с возрастанием end_date, если end_date больше или равен сегодняшнему, чем список, упорядоченный по убыванию start_date для objets с 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); 
    } 
} 

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

+1

То же самое можно достичь с помощью метода Collections.sort(). – ADM

+0

Метод .sort() не учитывает мои условия – Maxime

ответ

0

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

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

+0

Спасибо за этот полезный ответ, я попробую его – Maxime

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

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