2012-04-12 24 views
5

में दिनांक चर के सेट का सबसे हालिया सेट कैसे प्राप्त करें मेरे पास अलग-अलग परिवर्तनीय नामों के साथ लगभग 8 दिनांक चर (java.util.Date) हैं। इन तिथियों में से सबसे हालिया (अधिकतम) चुनने का सबसे कुशल/सर्वोत्तम तरीका क्या है?जावा

+0

कई बार या सिर्फ एक बार? – Tudor

+0

बस एक बार। सभी दिनांक परिवर्तनीय मान अलग हो सकते हैं। मैं बस एक जेएसपी पेज पर प्रदर्शित करने के लिए सबसे हाल की तारीख को कुशलतापूर्वक खोजने की कोशिश कर रहा हूं। – user6123723

+0

क्या हाल ही में सबसे हालिया तारीख है या आपको भविष्य की तिथियों के लिए खाते की आवश्यकता है? – eabraham

उत्तर

17

उन्हें एक संग्रह में स्टोर - यह वैसे भी अपने कार्यक्रम डिजाइन के मामले में समझ बनाने सकता है: भी किसी भी Comparable के लिए काम करते हैं। यदि आपके पास उदा। एक सूची वस्तु, आप कर सकते हैं:

Collections.max(dates); 
2

Date तुलनीय है, इसलिए उन सब को एक सूची में जोड़ने, और Collections.max() का उपयोग सबसे बड़ी (नवीनतम) तिथि को खोजने के लिए:

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

वास्तव में, यदि आप कल्पना प्राप्त करना चाहता था, तो आप ऐसा कर सकते हैं:

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

और इस तरह इसे कहते:

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

लेकिन यह होगा , आदर्श रूप में

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

यह ओ (एन लॉग एन) है, जबकि संग्रह। मैक्स ओ (एन) है। – Richante

6

उन्हें एक सूची में रखो और Collections.max का उपयोग करें।

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

तो फिर तुम यह इतना की तरह फोन चाहते हैं:

3

जब से तुम अलग चर में अपने सभी तिथियों भंडारण कर रहे हैं, तो आपको निम्न varargs समारोह की तरह कुछ करते हैं और इसे करने के लिए बंद अपने सभी चर पारित करने के लिए की जरूरत है :

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

यह कुशल नहीं है क्योंकि वह केवल अधिकतम एक बार प्राप्त करना चाहता है। सॉर्टिंग ओ (एन * लॉगएन) लेता है जबकि एक अधिकतम अधिकतम ऑपरेशन ओ (एन) होता है। – Tudor

+0

@ ट्यूडर यकीन है, हालांकि सभी निष्पक्षता में, छोटे एन के साथ (और मुझे लगता है कि उसे छोटा एन बी/सी मिल गया है अन्यथा विभिन्न क्षेत्रों का पूरा समूह बनाए रखना बहुत काम होगा), ऐसा नहीं होने वाला है बहुत अंतर – stevevls

1

उन सब को एक संग्रह में जोड़े और फिर इसे सॉर्ट, या उन्हें एक संग्रह है कि पहली जगह में आदेश दिया है, इस तरह के 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

इसकी कार्यक्षमता नियमित संग्रह के साथ कार्यान्वयन की तुलना कैसे करती है? – user6123723

+0

अच्छा सवाल। यह ओ (एन लॉग एन) होना चाहिए, इसे एक सूची में जोड़ने और फिर सॉर्ट करना चाहिए। हालांकि, Collections.max (जैसा कि कई अन्य उत्तरों में संदर्भित है) ओ (एन) है, इसलिए यह मेरे उत्तर से निश्चित रूप से अधिक कुशल है। – mongiesama