2012-04-12 12 views
5

Mam około 8 zmiennych daty (java.util.Date) z różnymi nazwami zmiennych. Jaki jest najlepszy/najlepszy sposób wyboru najnowszych (maksymalnych) dat?Jak uzyskać najnowszą z zestawu zmiennych daty w java

+0

Kilka razy lub tylko raz? – Tudor

+0

tylko raz. wszystkie wartości zmiennych daty mogą być różne. Próbuję po prostu znaleźć najnowszą datę efektywnie do wyświetlania na stronie jsp. – user6123723

+0

Czy najnowszy zawsze jest maksymalny lub czy trzeba uwzględniać przyszłe daty? – eabraham

Odpowiedz

17

Najlepiej przechowywać je w kolekcji - może to mieć sens z punktu widzenia projektowania programu w każdym razie. Jeśli masz np. Lista obiekt, można zrobić:

Collections.max(dates); 
2

Date jest porównywalna, więc dodać je wszystkie na liście i użyć Collections.max() znaleźć największe (najnowszy) Data:

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

Właściwie, jeśli chcesz uzyskać fantazyjny, można to zrobić:

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

i nazwać tak:

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

Ale to będzie również pracować na dowolnym Comparable:

Integer biggest = MyClass.max(3, 7, 4, 1); 
+2

To jest O (N log N), natomiast Collections.max to O (N). – Richante

6

umieścić je na liście i użyć Collections.max.

3

Skoro przechowywania wszystkich dat w różnych zmiennych, trzeba zrobić coś jak na poniższym varargs funkcji i przekazać wszystkie zmienne poza nim:

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

Wtedy to nazwać jak tak :

Date mostRecent = getMostRecentDate(date1, date2, date3 /* etc.*/); 
+0

To nie jest efektywne, ponieważ chce tylko raz uzyskać maksimum. Sortowanie zajmuje O (N * logN), podczas gdy pojedynczą operacją maksimum jest O (N). – Tudor

+0

@Wspaniaj, choć w całkowitej uczciwości, z małym N (i zakładam, że ma mały N b/c w przeciwnym razie utrzymanie całej gamy różnych pól będzie wymagało wiele pracy), nie będzie duża różnica. – stevevls

1

dodać je wszystkie do kolekcji, a następnie posortować je lub dodawać je do kolekcji, że zamówione w pierwszej kolejności, takich jak kolejka priorytetowa:

PriorityQueue<Date> dateQ = new PriorityQueue<Date>(); 
dateQ.add(someDate); 
dateQ.add(anotherDate); 
dateQ.add(thirdDate); // etc... 
System.out.println("Max date is: " + dateQ.peek()); 
+0

W jaki sposób efektywność tego rozwiązania porównuje się do wdrożenia z regularną kolekcją? – user6123723

+0

Dobre pytanie. Powinno to być O (N log N), tak samo jak dodanie do listy, a następnie sortowanie. Jednak Collections.max (jak wspomniano w kilku innych odpowiedziach) jest O (N), więc jest zdecydowanie bardziej wydajny niż moja odpowiedź. – mongiesama

Powiązane problemy