Java哈希映射搜索日期键

4

我有一个哈希表:

Map dateEvent = new HashMap();

其中键是日期和时间,值为字符串。我填充集合的数据,其中日期格式为dd.MM.yyyy HH:mm。

如何根据这个格式获取所有以dd.MM.yyyy为基础的键呢?


我希望你正在使用泛型,只是在这里忘记写了。千万不要使用原始类型。 - user219882
2
当你说键是日期和时间时,你是指一个Date对象还是一个形式为dd.MM.yyyy HH:mmString对象? - Qwerky
1
这可能会对你有所帮助。虽然不是完全相同的情况,但其中有一个使用日期作为键的有用代码。 - user219882
“date based on this format: dd.MM.yyyy” 是什么意思?你所有的键都是相同的格式,对吗? - Swagatika
4个回答

11

这段代码可以解决问题:

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”的字符串,因此如果日期相同,则任何小时/分钟/秒钟上的差异仍然匹配。

此代码还展示了迭代Map的最佳方式(依我之见)。


如果你需要键和值,这肯定是迭代映射的最佳方式。像FindBugs这样的代码分析器也会注意到这一点。 - musiKk

0

不确定我是否理解您的意思。但是,您可以使用map.keySet()从映射中获取键集。如果您想查找所有不同的日期,请将所有日期填入一个集合中。如果您想将精度降低到天数,则一种解决方案是将日期转换为所需格式并将这些字符串添加到集合中。重复项将自动删除。

E.g.:

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)。)

暴力的替代方法是扫描所有键,无论它们是否符合你的标准。


(如果您这样做,不建议您基于已经定义了这些方法的另一个类(例如java.util.Date)来构建该类。)为什么? - Dejell
@Dejel 我很确定这违反了合同。java.util.Date#equals() 规定两个日期必须精确到毫秒才能相等。 - musiKk

0

01.01.2011(dd.MM.yyyy)01.01.2011 00:00(dd.MM.yyyy HH:mm)之间没有区别。

Date保存了一个具有小时和分钟的long。即使对于public Date(int year, int month, int date)也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接