2013-01-08 12 views
1

能夠搜索TreeMap<Date, String>的鍵(如NavigableMap<Date, String>)的正確方法是什麼?我想在哪一個月查看並輸出所有那些月份?使用Date作爲鍵的樹形圖Java

例如,如果它看起來像下面那樣,我將如何能夠搜索所有那些密鑰2月?

Date date1 = dateformat.parse("8 January 2013"); 

回答

5

如果使用NavigableMap實現,你可以打電話subMap得到兩個鍵之間的映射關係的視圖:

DateFormat dateFormat = new SimpleDateFormat("dd MMM yyyy"); 

//using TreeMap for example 
NavigableMap<Date, String> stringsByDate = new TreeMap<Date, String>(); 

//populate map 
Date jan15th = dateFormat.parse("15 January 2013"); 
Date feb12th = dateFormat.parse("12 February 2013"); 
Date feb24th = dateFormat.parse("24 February 2013"); 
Date march18th = dateFormat.parse("18 March 2013"); 
stringsByDate.put(jan15th, "foo"); 
stringsByDate.put(feb12th, "bar"); 
stringsByDate.put(feb24th, "baz"); 
stringsByDate.put(march18th, "qux"); 

//define "from" and "to" keys 
Date feb1st = dateFormat.parse("1 February 2013"); 
Date march1st = dateFormat.parse("1 March 2013"); 

//get the specified view 
NavigableMap<Date, String> febStringsByDate = stringsByDate.subMap(
     feb1st, 
     true,  //include Feb 1st 
     march1st, 
     false  //don't include March 1st 
); 

//prints {Tue Feb 12 00:00:00 EST 2013=bar, Sun Feb 24 00:00:00 EST 2013=baz} 
System.out.println(febStringsByDate); 

由於展現了「從」,並在通話「到」使用的密鑰到subMap本身不需要包含在地圖中。

注:這將僅適用於特定,例如日期工作2013年2月。如果您需要全部二月份日期的條目,則需要逐年迭代併合並結果。

+0

這正是我一直在尋找的謝謝。 – Melky

2
  • 首先,Date是可變的,並且使用可變對象作爲Map中的鍵,不推薦使用。

  • 但要回答你的問題:你需要迭代你的地圖上的鍵,並根據給定的標準檢查每個鍵。您可以將日期換成Calendar類,以使日,月,年和...比較更容易。

+0

提及可變日期對象的+1。當在Map或HashSet中用作鍵時,它可能會導致棘手的問題。 – JoG

0

只是有同樣的問題,花了一些時間來弄清楚爲什麼它不工作。

它簡單地比較了各個日期對象的散列,即使日期相等,它們也是不同的。

我嘗試使用下面的數據結構

SortedMap<Date,List<String>>

,但它不允許多個成員添加到列表中的map.get(日期)始終返回null即使有那裏已經是同一天了。