约会

2011-08-19 57 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)