Как получить самый последний набор переменных даты в java

У меня есть около 8 переменных даты (java.util.Date) с разными именами переменных. Какой самый эффективный/лучший способ выбрать самую последнюю (максимальную) из этих дат?


person user6123723    schedule 12.04.2012    source источник
comment
только раз. все значения переменных даты могут быть разными. Я просто пытаюсь эффективно найти самую последнюю дату для отображения на странице jsp.   -  person user6123723    schedule 12.04.2012
comment
Является ли самая последняя всегда максимальной или вам нужно учитывать будущие даты?   -  person eabraham    schedule 12.04.2012
comment
самая последняя - макс. Все даты являются прошлыми датами.   -  person user6123723    schedule 12.04.2012


Ответы (5)


В идеале храните их в коллекции — в любом случае это может иметь смысл с точки зрения дизайна вашей программы. Если у вас есть, например. объект списка, вы можете сделать:

Collections.max(dates);
person Richante    schedule 12.04.2012

Поместите их в список и используйте Collections.max.

person Tim Pote    schedule 12.04.2012

Поскольку вы храните все свои даты в разных переменных, вам нужно сделать что-то вроде следующей функции varargs и передать ей все ваши переменные:

protected Date getMostRecentDate(Date ... dates) {
    Arrays.sort(dates);
    return myDateArray[dates.length - 1];
}

Тогда вы бы назвали это так:

Date mostRecent = getMostRecentDate(date1, date2, date3 /* etc.*/);
person stevevls    schedule 12.04.2012
comment
Это неэффективно, так как он хочет получить максимум только один раз. Сортировка занимает O (N * log N), а одна максимальная операция - O (N). - person Tudor; 12.04.2012
comment
@Tudor уверен, хотя, честно говоря, с небольшим N (и я предполагаю, что у него маленький N b / c, иначе поддерживать целую кучу разных полей будет много работы), многого не будет разница. - person stevevls; 12.04.2012

Date сопоставимы, поэтому добавьте их все в список и используйте Collections.max(), чтобы найти самую большую (последнюю) дату:

List<Date> dates = new ArrayList<Date>();
dates.add(foo);
dates.add(bar);
... etc
Date latest = Collections.max(list);

На самом деле, если вы хотите пофантазировать, вы можете сделать это:

public static <T extends Comparable<T>> T max(T... items) {
    return Collections.max(Arrays.asList(items));
}

И назовите это так:

Date latest = MyClass.max(foo, bar, fred);

Но это также будет работать для любого Comparable:

Integer biggest = MyClass.max(3, 7, 4, 1);
person Bohemian♦    schedule 12.04.2012
comment
Это O (N log N), тогда как Collections.max — O (N). - person Richante; 12.04.2012

Добавьте их все в коллекцию, а затем отсортируйте ее или добавьте их в коллекцию, которая упорядочена в первую очередь, например PriorityQueue:

PriorityQueue<Date> dateQ = new PriorityQueue<Date>();
dateQ.add(someDate);
dateQ.add(anotherDate);
dateQ.add(thirdDate); // etc...
System.out.println("Max date is: " + dateQ.peek());
person mongiesama    schedule 12.04.2012
comment
Как эффективность этого по сравнению с реализацией с обычной коллекцией? - person user6123723; 12.04.2012
comment
Хороший вопрос. Это должно быть O (N log N), так же, как добавление его в список и последующая сортировка. Однако Collections.max (как указано в нескольких других ответах) - это O (N), так что это определенно более эффективно, чем мой ответ. - person mongiesama; 12.04.2012