java

2012-04-12 14 views
5

bir tarih parametreleri kümesinin en son nasıl elde edilir Farklı değişken adlarıyla yaklaşık 8 tarih değişkenine (java.util.Date) sahibim. Bu tarihlerin en güncel (en çok) seçimini yapmanın en etkili/en iyi yolu nedir?java

+0

Birkaç kez mi yoksa sadece bir kez mi? – Tudor

+0

sadece bir kez. tüm tarih değişken değerleri farklı olabilir. Sadece bir jsp sayfasında görüntülemek için en son tarihi verimli bir şekilde bulmaya çalışıyorum. – user6123723

+0

En son herzaman maksimum mu, yoksa gelecek tarihleri ​​hesaba katmanız mı gerekiyor? – eabraham

cevap

17

bir koleksiyon saklayabilirsiniz - bu zaten program tasarım açısından mantıklı olabilir: aynı zamanda herhangi Comparable için çalışıyorum. Eğer varsa Bir Liste nesnesi, yapabileceğiniz:

Collections.max(dates); 
2

Date karşılaştırılabilir, böylece bir listeye hepsini ekleyin ve en büyük (en son) tarihi bulmak için Collections.max() kullanın: Eğer fantezi olsun isterse, bunu yapabilir Aslında

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

:

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

Ama olacak:

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

Ve böyle diyoruz İdeal

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

Bu, O (N log N), Collections.max ise O (N). – Richante

6

bir List koyun ve Collections.max kullanın.

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

Sonra şöyle derdim:

3

farklı değişkenler tüm tarihleri ​​depolamak yaptığınızdan, varargs aşağıdaki fonksiyonu gibi bir şey yapmak ve buna kapalı tüm değişkenleri geçmesi gerekiyor :

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

Bu sadece bir kez maksimum almak istediğinden, verimli değil. Sıralama, tek bir maksimum işlem O (N) iken O (N * logN) alır. – Tudor

+0

@Tasarım, her ne kadar adalet içinde olsa da, küçük N ile (ve küçük olduğunu varsayalım, aksi takdirde bir çok farklı alanın bir kısmını sürdürmesi çok fazla iş olacaktır), olmayacak. çok fark var. – stevevls

1

bir koleksiyona hepsini ekleyin ve sonra sıralamak veya bu tür PriorityQueue olarak ilk etapta sipariş bir koleksiyona, bunları ekleyin:

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

Bunun verimliliği, düzenli bir koleksiyonla yapılan bir uygulama ile nasıl karşılaştırılır? – user6123723

+0

İyi soru. Bu, O (N log N) olmalı, bir listeye ekleyip sıralamaya benzer. Bununla birlikte, Collections.max (diğer birçok cevapta atıfta bulunularak) O (N) olduğundan cevabımdan kesinlikle daha verimli olur. – mongiesama