2010-10-07 14 views
6

मेरे पास तिथियों की एक सूची है और वर्तमान तिथि है।किसी सूची से निकटतम दिनांक खोजें

मुझे वर्तमान तिथि के नजदीक की तारीख कैसे मिल सकती है?

साथ सभी तिथियों के माध्यम से
+1

क्या आप अधिक विशिष्ट हो सकते हैं? ऐसा लगता है कि आपके पास तिथियों की एक सूची है, और आप अब तक के सबसे नज़दीकी को ढूंढना चाहते हैं? एक संक्षिप्त कोड नमूना उपयोगी होगा –

+0

-1 कृपया अधिक जानकारी दें –

उत्तर

2

लूप निम्नलिखित:
1. एक चर है कि मौजूदा निकटतम तारीख का ट्रैक रखता है
2. एक चर है कि मौजूदा निकटतम तारीख और आज की तारीख के बीच अंतर है है

जब आप उस ट्रैक के मुकाबले एक अंतर पाते हैं जिसमें आप ट्रैक कर रहे हैं (2), अंतर अपडेट करें और वर्तमान निकटतम दिनांक

अंत में, वर्तमान निकटतम तिथि निकटतम तिथि है संग्रह में

यहां अजगर में कोड है:

dates = [date(2010,1,2), date(2010,5,6), date(2010,3,4), date(2011, 1, 2), date(2010,10,20), date(2009,2,3)] 
current_date = dates[0] 
current_min = abs(current_date - date.today()) 
for d in dates: 
    if abs(d - date.today()) < current_min: 
     current_min = abs(d - date.today()) 
     current_date = d 
+0

कृपया मुझे कुछ उदाहरण दें –

20

मैं एक कस्टम तुलनित्र के साथ Collection.min का उपयोग करेंगे कि वर्तमान समय से दूरी के अनुसार, "आदेश" दिनांकों।

final long now = System.currentTimeMillis(); 

// Create a sample list of dates 
List<Date> dates = new ArrayList<Date>(); 
Random r = new Random(); 
for (int i = 0; i < 10; i++) 
    dates.add(new Date(now + r.nextInt(10000)-5000)); 

// Get date closest to "now" 
Date closest = Collections.min(dates, new Comparator<Date>() { 
    public int compare(Date d1, Date d2) { 
     long diff1 = Math.abs(d1.getTime() - now); 
     long diff2 = Math.abs(d2.getTime() - now); 
     return Long.compare(diff1, diff2); 
    } 
}); 
+1

ग्रेट उत्तर ... –

+0

@aioobe: क्यों हम केवल getTime की तुलना नहीं कर सकते (Math.abs (d1.getTime() नहीं - अभी व))? –

+2

@Stas: क्योंकि यह अन्यथा "स्वाभाविक रूप से" तारीखों को ऑर्डर करेगा। हम 'अब' के साथ अंतर से ऑर्डर करना चाहते हैं। हालांकि स्मार्ट समाधान। ओपी एक झटका है, भले ही यह एक +1 के लायक है। – BalusC

2

आप इस कोड की कोशिश कर सकते हैं:

public static Date closerDate(Date originalDate, Collection<Date> unsortedDates) { 
    List<Date> dateList = new LinkedList<Date>(unsortedDates); 
    Collections.sort(dateList); 
    Iterator<Date> iterator = dateList.iterator(); 
    Date previousDate = null; 
    while (iterator.hasNext()) { 
     Date nextDate = iterator.next(); 
     if (nextDate.before(originalDate)) { 
      previousDate = nextDate; 
      continue; 
     } else if (nextDate.after(originalDate)) { 
      if (previousDate == null || isCloserToNextDate(originalDate, previousDate, nextDate)) { 
       return nextDate; 
      } 
     } else { 
      return nextDate; 
     } 
    } 
    return previousDate; 
} 

private static boolean isCloserToNextDate(Date originalDate, Date previousDate, Date nextDate) { 
    if(previousDate.after(nextDate)) 
     throw new IllegalArgumentException("previousDate > nextDate"); 
    return ((nextDate.getTime() - previousDate.getTime())/2 + previousDate.getTime() <= originalDate.getTime()); 
} 
4

सूची सॉर्ट हो जाता है, तो आप उपयोग कर सकते हैं Collections.binarySearch() जगह है जहाँ दी गई तारीख सूची में हल हो जाएगा लगता है - सबसे करीब से एक है या तो उस सूचकांक से ठीक पहले या दाएं।

बहुत बड़ी सूचियों के लिए, यह अन्य समाधानों की तुलना में बहुत तेज़ है, लेकिन निश्चित रूप से इसे क्रमबद्ध करने की सूची की आवश्यकता होती है। यदि आप कई बार ऐसी क्वेरी करने जा रहे हैं, तो पहले सूची को सॉर्ट करने के लिए यह इसके लायक होगा (प्रदर्शन-वार)।

1

आप एक List के बजाय एक Set उपयोग कर सकते हैं, एक NavigableSet ऐसे TreeSet के रूप में दिनांक डाल दिया और तरीकों lower और higher का उपयोग करते हैं।

NavigableSet<Date> dates = new TreeSet<Date>(); 
// add some dates to dates 
Date now = new Date(); 
Date highestDateUpUntilNow = dates.lower(now); 
संबंधित मुद्दे