Сортировка массива объектов по дате в формате SS :: MM :: HH MM / DD / YY / - PullRequest
0 голосов
/ 12 февраля 2010

У меня есть массив объектов, каждый из которых содержит уникальную дату в следующем формате

YEAR-DAY-MONTH HOUR:MINUTE:SECOND (example: 2010-02-10 23:32:14)

Я пытаюсь сравнить каждый объект в списке массивов (их несколько тысяч) с возрастающим классом таймера, который я создал, чтобы проверить, совпадают ли оба раза. Кажется, что самый простой способ проверить, совпадают ли даты объекта и таймера, состоит в том, чтобы сначала отсортировать список массивов от самого раннего к последнему, а затем проверить каждый отдельный объект, перейдя к следующему в списке, когда один из таймер. Однако я не уверен, как отсортировать список массивов на основе ранее упомянутого формата времени. Пока что мои датированные объекты имеют следующие свойства:

public float min;
public float hour;
public float day;
public float month;
public float year;

Как можно отсортировать список массивов этих объектов, чтобы он был отсортирован с самой ранней до самой поздней даты?

Ответы [ 3 ]

6 голосов
/ 12 февраля 2010

1 - Создайте Comparator для вашего объекта

2 - Затем используйте Collections.sort в списке этих объектов

4 голосов
/ 12 февраля 2010

Потенциальное простое решение

Мне кажется, что вы изобретаете колесо здесь. Существует множество типов, представляющих дату и время, и создание собственного может привести к боли. В этом случае я бы рекомендовал использовать LocalDateTime из Joda Time .

Ответ на актуальный вопрос

Вы упоминаете «формат», как будто мы действительно имеем дело со строками - но я ничего не вижу там о строках.

Почему вы используете float значения? Они кажутся натуральными целыми числами - хотя вам также понадобятся секунды.

Вы можете сделать свой тип реализации Comparable<T> довольно легко и непринужденно - тогда вам просто нужно вызвать Collections.sort, и это будет правильно. Вот пример реализации Comparable<Foo>, предполагая, что ваш тип называется Foo:

public int compareTo(Foo other)
{
    if (other == null)
    {
        throw new NullPointerException();
    }
    if (year < other.year)
    {
        return -1;
    }
    if (year > other.year)
    {
        return 1;
    }
    if (month < other.month)
    {
        return -1;
    }
    if (month > other.month)
    {
        return 1;
    }
    // etc
    // If we haven't returned after comparing everything
    // then the values must be equal
    return 0;
}

ответ chburd о реализации Comparer<T> вместо этого одинаково действителен; если ваш объект просто дата / время, то у вас есть естественный порядок сортировки и, возможно, Comparable<T> - лучший выбор; если у вас на самом деле есть больше свойств в объекте, и вы можете вместо этого отсортировать их, тогда Comparer<T> будет лучше.

0 голосов
/ 12 февраля 2010

Это может быть слишком простой ответ, но почему бы просто не поместить значения в TreeMap для начала?

    TreeMap<Date, Date> sortedMap = new TreeMap<Date, Date>();
    List<Date> listOfObjectsToSort = new ArrayList<Date>();
    for (Date theDate : listOfObjectsToSort)
    {
      sortedMap.put(theDate.getTime(), theDate);
    }
    List<Date> sotedList = (List<Date>) sortedMap.values();

Карта дерева может сортироваться по долгому времени.* Я знаю, что создавать карту списка дороже, когда у вас может быть компаратор в списке.

(теперь, чтобы получить кофе, а затем прочитайте это снова)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...