2012-04-12 19 views
5

Tengo alrededor de 8 variables de fecha (java.util.Date) con diferentes nombres de variable. ¿Cuál es la forma más eficiente/mejor de elegir la fecha más reciente (máxima) de estas fechas?Cómo obtener el más reciente de un conjunto de variables de fecha en java

+0

¿Varias veces o solo una vez? – Tudor

+0

solo una vez. todos los valores de las variables de fecha pueden ser diferentes. Solo estoy tratando de encontrar la fecha más reciente de manera eficiente para mostrar en una página jsp. – user6123723

+0

¿El más reciente es siempre el máximo o necesita contabilizar las fechas futuras? – eabraham

Respuesta

17

Lo ideal es almacenarlos en una colección - esto podría tener sentido en términos de su diseño de los programas de todos modos. Si tiene, por ejemplo, un objeto de lista, que puede hacer:

Collections.max(dates); 
2

Date es comparable, por lo que añadir a todos ellos a una lista, y el uso Collections.max() para encontrar el mayor (más reciente) Fecha:

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

En realidad, si usted quiere conseguir la suposición, usted puede hacer esto:

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

y lo llaman así:

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

pero será También funciona para cualquier Comparable:

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

Esto es O (N log N), mientras que Collections.max es O (N). – Richante

6

ponerlos en una lista y utilizar Collections.max.

3

Puesto que usted está almacenando todas sus fechas en diferentes variables, tiene que hacer algo como lo siguiente función varargs y pasar todas las variables fuera de ella:

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

Luego que se dice que como tal :

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

Esto no es eficiente ya que solo quiere obtener el máximo una vez. La ordenación toma O (N * logN) mientras que una sola operación máxima es O (N). – Tudor

+0

@Tudor seguro, aunque con toda justicia, con N pequeña (y estoy suponiendo que tiene un pequeño N b/c que de lo contrario mantendrá un montón de campos diferentes va a ser mucho trabajo), no va a haber mucha diferencia – stevevls

1

añadir a todos ellos a una colección y luego clasificarla, o añadirlos a una colección que se ordenó en el primer lugar, como 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()); 
+0

¿Cómo se compara la eficiencia de esto con una implementación con una colección regular? – user6123723

+0

Buena pregunta. Esto debería ser O (N log N), lo mismo que agregarlo a una lista y luego ordenarlo. Sin embargo, Collections.max (como se hace referencia en varias otras respuestas) es O (N), por lo que definitivamente es más eficiente que mi respuesta. – mongiesama

Cuestiones relacionadas