使用Date作为密钥Java的Treemap

时间:2013-01-08 05:58:22

标签: java date treemap

能够搜索TreeMap<Date, String>的密钥(例如NavigableMap<Date, String>)的正确方法是什么?我希望在特定月份检查并输出那个月的所有那些?

例如,如果它如下所示,我将如何搜索所有具有密钥二月的人?

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

3 个答案:

答案 0 :(得分:7)

如果使用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月。如果您需要所有 2月日期的条目,则需要按年份进行迭代并合并结果。

答案 1 :(得分:2)

  • 首先,不推荐日期是可变的,并且不建议在地图中使用可变对象作为关键字。

  • 但要回答您的问题:您需要迭代地图中的键并根据给定的条件检查每个键。您可以将日期包装到Calendar课程中,以使日,月,年和...比较更容易。

答案 2 :(得分:0)

只是遇到同样的问题,花了一些时间才弄明白为什么它不起作用。

它只是比较各个Date对象的哈希值,即使日期相等也是如此。

我正在尝试使用以下数据结构

SortedMap<Date,List<String>>

但它不允许向该列表添加多个成员,因为即使已存在相同的日期,map.get(date)也始终返回null。