从列表中查找最近的日期
我有一个日期列表和当前日期。
如何找到最接近当前日期的日期?
我将Collection.min
与自定义比较器一起使用,该比较器根据与当前时间的距离“命令”日期。
final long now = System.currentTimeMillis(); // Create a sample list of dates List dates = new ArrayList (); 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 () { 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); } });
如果列表已排序,那么您可以使用Collections.binarySearch()
来查找将给定日期排序到列表中的位置 – 最接近的位置在该索引之后或之前。
对于非常大的列表,这比其他解决方案快得多,但当然它确实需要对列表进行排序。 如果您要多次执行此类查询,则首先对列表进行排序是值得的(性能方面)。
你可以试试这段代码:
public static Date closerDate(Date originalDate, Collection unsortedDates) { List dateList = new LinkedList (unsortedDates); Collections.sort(dateList); Iterator 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()); }
使用以下内容遍历所有日期:
1.有一个跟踪当前最近日期的变量
2.有一个变量,它是当前最近日期和当前日期之间的差异
如果您发现的差异小于您在(2)中跟踪的差异,请更新差异和当前最近的日期
最后,当前最接近的日期是集合中最接近的日期
这里是python中的代码:
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
如果您可以使用Set
而不是List
,请将日期放在NavigableSet
例如TreeSet
并使用lower
和higher
的方法。
NavigableSet dates = new TreeSet (); // add some dates to dates Date now = new Date(); Date highestDateUpUntilNow = dates.lower(now);
- Android SearchView空字符串
- 无法在android中的FTP服务器上传文件
- 使用Java For Android的HTTP API请求
- 如何以编程方式在锁定屏幕上设置快捷方式
- Buck – java.lang.UnsatisfiedLinkError:找不到“libjni.so”。 怎么解决?
- TranslateAnimation无法按预期工作
- 我如何拥有与内容重叠的ActionBar图标/徽标?
- Android webview.postUrl(url,Encodingutils.getBytes(postData,“BASE64”))从postdata字符串中删除“+”
- 在android项目中包含gturri android xml rpc库