約會

2011-08-19 55 views
4

的Java HashMap的搜索鍵我有一個HashMap: 地圖dateEvent =新的HashMap();其中key是日期和時間,value是字符串。 我用日期格式爲dd.MM.yyyy的數據填充集合HH:mm。 如何根據這種格式獲取所有帶日期的密鑰:dd.MM.yyyy?約會

+0

我希望你使用泛型,你忘記它寫在這裏。永遠不要使用原始類型。 – user219882

+2

當你說key是一個日期和時間時,你是指'dd.MM.yyyy HH:mm'形式的'Date'對象還是'String'對象? – Qwerky

+1

http://stackoverflow.com/questions/6261237/sort-keys-which-are-date-entries-in-a-hashmap這可能會幫助你。這不是確切的案例,但有一個有用的代碼與日期作爲關鍵。 – user219882

回答

10

此代碼將這樣的伎倆:

public static void findEvents(Map<Date, Event> dateEvents, Date targetDate) { 
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy"); 
    String target = dateFormat.format(targetDate); 
    for (Map.Entry<Date, Event> entry : dateEvents.entrySet()) { 
     if (dateFormat.format(entry.getKey()).equals(target)) { 
      System.out.println("Event " + entry.getValue() + " is on the specified date"); 
     } 
    } 
} 

這裏最重要的是,所有的日期將被轉換與格式「DD.MM.YYYY」的字符串比較之前,所以在任何差異小時/分鐘/秒仍然匹配,如果一天是相同的。

此代碼還演示了遍歷地圖的最佳方式(恕我直言)

+0

如果您需要密鑰和值,這肯定是迭代地圖的最佳方式。代碼分析器如FindBugs也會注意到這一點。 – musiKk

+0

謝謝你的快速幫助 - 它對我很好用! :) – user902201

0

不知道我是否可以得到你的權利。但是,您使用map.keySet()從地圖中獲取了一組鍵。如果您想查找所有不同的日期,請將所有日期填入集合中。如果您想將精度降低到幾天,一種解決方案是將日期轉換爲所需的格式,並將這些字符串添加到一組中。重複將被自動刪除。

例如爲:

Map<Date, String> yourMap = [..]; 

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy"); 

Set<String> differentDates = new HashSet<String>(); 
for (Date date: yourMap.keySet()) { 
    differentDates.add(simpleDateFormat.format(date)); 
} 
0

你有(至少)兩個選項:

你可以寫你自己的日期類提供的hashCode()equals()適當的實現。 (如果這樣做,不建議您將該類基於另一個已定義這些方法的類(例如java.util.Date)。)

蠻力的替代方法是掃描所有的鍵是否符合您的標準。

+0

「(如果你這樣做,不建議你將該類基於另一個已經定義了這些方法的類(例如java.util.Date)。)」爲什麼? – Dejell

+0

@Dejel很確定這違背了合同。 ['java.util.Date#equals()'](http://docs.oracle.com/javase/7/docs/api/java/util/Date.html#equals(java.lang.Object))states兩個日期必須等於毫秒以便相等。 – musiKk

0

有日期01.01.2011(DD.MM.YYYY)和日期01.01.2011 00:00DD.MM.YYYY HH:MM)之間沒有差別

Date持有long具有小時和分鐘。即使public Date(int year, int month, int date)