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
risposta
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);
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);
Questo è O (N log N), mentre Collections.max è O (N). – Richante
Mettetele in un elenco e utilizzare Collections.max
.
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.*/);
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
@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
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());
Come si confronta l'efficienza di questa con un'implementazione con una collezione regolare? – user6123723
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
Più volte o solo una volta? – Tudor
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
Il più recente è sempre il massimo o è necessario tenere conto delle date future? – eabraham