2012-07-28 111 views
4

我在寻找更好的方法来检查的java.util.Date对象(返回给我的ArrayList)。情况是,我返回了日期的List,并且我想知道我手边的日期是否在我返回的日期的List之内。检查日期列表是否包含特定日期

目前我在做的是循环列表并使用JodaTime来比较日期。

注:比较日期(不是时间部分)时只应考虑日期部分。

+0

你想一个HashMap/HashSet的这样你可以在O(1)时间找到它? – 2012-07-28 01:50:53

+1

请详细说明。你有一个java.util.Date对象列表吗?字符串?一些其他类型的日期表示? – dnault 2012-07-28 01:52:40

+0

我有一个java.util.Date对象列表。 – 2012-07-28 01:54:33

回答

6

写你自己的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个月大睡,对未成年人的错误道歉)

+0

您可以修改比较器,或根据需要提供不同的比较器。我不喜欢二分查找的唯一方法就是它不会返回一个数组,但这是另一个问题 – MadProgrammer 2012-07-28 06:04:47

+0

我喜欢使用Java Comparator/Comparable,因为它是推荐的方法。但不确定是否应该将java.util.Date转换为JodaTime的DateTime,并使用JodaTime在比较器中进行日期比较。你拿这个? – 2012-07-28 09:51:36

+0

这完全取决于你。您必须权衡时间成本(在开发时间和执行时间内)以及解决方案的说服力。使用比较器/可比API的主要原因是它在整个Java API中得到很好的支持。在一天结束时,Joda时间仍然只使用Comarator API,它只是更丰富,然后我演示的那个;) – MadProgrammer 2012-07-28 09:59:44

1

如果两个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()

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#binarySearch%28java.util.List,%20java.lang.Object%29

+0

对不起,只考虑日期组件,在我的情况下时间组件不能用于比较。 – 2012-07-28 02:02:30

+0

但最新搜索方法'列表'包含()'使用?我相信他应该使用某种在这种情况下最好的搜索方法。除非'contains()'已经这样做。我刚刚说的是静音哈哈。 – Andy 2012-07-28 02:03:57

+0

@ChinBoon:哦,我误解了。在这种情况下,循环和使用JodaTime可能是一条可行的路。另外,确保在比较时使用正确的时区。 – dnault 2012-07-28 02:09:08

相关问题