2012-07-28 159 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

相關問題