检查日期列表是否包含特定日期
我在寻找更好的方法来检查的java.util.Date
对象(返回给我的ArrayList
)。情况是,我返回了日期的List
,并且我想知道我手边的日期是否在我返回的日期的List
之内。检查日期列表是否包含特定日期
目前我在做的是循环列表并使用JodaTime来比较日期。
注:比较日期(不是时间部分)时只应考虑日期部分。
写你自己的Comparator。您可以使用它来执行Date
对象
public class MyDateComparator implements Comparator<Date> {
protected static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy");
public int compare(Date d1, Date d2) {
return DATE_FORMAT.format(d1).compareTo(DATE_FORMAT.format(d2));
}
}
Date myDate = ...
List<Date> listOfDates = ...
Collections.sort(listOfDates);
int index = Collections.binarySearch(listOfDates, myDate, new MyDateComparator());
if (index >= 0) {
// you found me
}
的个体比较(类型与iPad上的脂肪手指,摇3个月大睡,对未成年人的错误道歉)
您可以修改比较器,或根据需要提供不同的比较器。我不喜欢二分查找的唯一方法就是它不会返回一个数组,但这是另一个问题 – MadProgrammer 2012-07-28 06:04:47
我喜欢使用Java Comparator/Comparable,因为它是推荐的方法。但不确定是否应该将java.util.Date转换为JodaTime的DateTime,并使用JodaTime在比较器中进行日期比较。你拿这个? – 2012-07-28 09:51:36
这完全取决于你。您必须权衡时间成本(在开发时间和执行时间内)以及解决方案的说服力。使用比较器/可比API的主要原因是它在整个Java API中得到很好的支持。在一天结束时,Joda时间仍然只使用Comarator API,它只是更丰富,然后我演示的那个;) – MadProgrammer 2012-07-28 09:59:44
如果两个java.util.Date对象解析为相同的毫秒,则它们是equal()。所以,你可以使用List.contains():
http://docs.oracle.com/javase/6/docs/api/java/util/List.html#contains%28java.lang.Object%29 http://docs.oracle.com/javase/6/docs/api/java/util/Date.html#equals%28java.lang.Object%29
List<Date> dates = ...
Date targetDate = ...
if (dates.contains(targetDate)) { ... }
或者,如果你知道列表进行排序,你可以使用Collections.binarySearch()
你想一个HashMap/HashSet的这样你可以在O(1)时间找到它? – 2012-07-28 01:50:53
请详细说明。你有一个java.util.Date对象列表吗?字符串?一些其他类型的日期表示? – dnault 2012-07-28 01:52:40
我有一个java.util.Date对象列表。 – 2012-07-28 01:54:33