2012-04-12 17 views
5

Ho circa 8 variabili di data (java.util.Date) con nomi di variabili differenti. Qual è il modo più efficiente/migliore per scegliere il più recente (massimo) di queste date?Come ottenere il più recente di un insieme di variabili di data in java

+0

Più volte o solo una volta? – Tudor

+0

solo una volta. tutti i valori delle variabili di data possono essere diversi. Sto solo cercando di trovare la data più recente in modo efficiente per la visualizzazione su una pagina jsp. – user6123723

+0

Il più recente è sempre il massimo o è necessario tenere conto delle date future? – eabraham

risposta

17

Idealmente, memorizzarli in una raccolta - questo potrebbe avere un senso in termini di vostra progettazione del programma stesso. Se hai, ad es. un oggetto List, si può fare:

Collections.max(dates); 
2

Date è paragonabile, in modo da tutti a creare una lista, e utilizzare Collections.max() per trovare il più grande (più recente) Data:

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

In realtà, se si voleva ottenere l'immaginazione, si potrebbe fare questo:

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

E chiamare in questo modo:

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

Ma lo farà lavorare anche per qualsiasi Comparable:

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

Questo è O (N log N), mentre Collections.max è O (N). – Richante

6

Mettetele in un elenco e utilizzare Collections.max.

3

Dal momento che si stanno memorizzando tutte le date in diverse variabili, è necessario fare qualcosa di simile alla seguente varargs funzione e passare tutte le variabili fuori di esso:

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

Poi devi chiamarlo in questo modo :

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

Questo non è efficiente dal momento che vuole solo ottenere il massimo una volta. L'ordinamento richiede O (N * logN) mentre una singola operazione massima è O (N). – Tudor

+0

@Sudore sicuro, anche se in tutta onestà, con N piccola (e presumo che abbia un piccolo Nb/c, altrimenti mantenere un sacco di campi diversi sarà molto lavoro), non ci sarà molta differenza – stevevls

1

tutti Aggiungere a una raccolta e poi ordinarlo, o aggiungerli ad una collezione che ha ordinato, in primo luogo, come ad esempio CodaConPriorita:

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

Come si confronta l'efficienza di questa con un'implementazione con una collezione regolare? – user6123723

+0

Buona domanda. Questo dovrebbe essere O (N log N), come aggiungerlo a un elenco e quindi ordinare. Tuttavia, Collections.max (come indicato in molte altre risposte) è O (N), quindi è decisamente più efficiente della mia risposta. – mongiesama