【问题标题】:Java hashmap search keys for a date日期的 Java hashmap 搜索键
【发布时间】:2011-10-30 12:11:13
【问题描述】:

我有一个哈希图: 映射 dateEvent = new HashMap();其中 key 是日期和时间, value 是字符串。 我用日期格式为 dd.MM.yyyy HH:mm 的数据填充集合。 如何根据这种格式获取所有带有日期的键:dd.MM.yyyy?

【问题讨论】:

  • 我希望你使用的是泛型而你忘了在这里写。永远不要使用原始类型。
  • 当您说 key 是日期和时间时,您是指Date 对象还是String 形式的dd.MM.yyyy HH:mm 对象?
  • stackoverflow.com/questions/6261237/… 这可能会对您有所帮助。这与您的情况不同,但有一个有用的代码,其中 Date 为键。
  • “基于这种格式的日期:dd.MM.yyyy”是什么意思?你所有的密钥都是相同的格式吗?

标签: java search key hashmap


【解决方案1】:

这段代码可以解决问题:

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

此代码还演示了迭代地图的最佳方式(恕我直言)。

【讨论】:

  • 如果您同时需要键和值,这肯定是迭代地图的最佳方式。 FindBugs 等代码分析器也会注意到这一点。
【解决方案2】:

日期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)

【讨论】:

    【解决方案3】:

    你有(至少)两个选择:

    您可以编写自己的 Date 类,该类提供 hashCode()equals() 的适当实现。 (如果您这样做,不建议将该类基于已定义这些方法的另一个类(例如java.util.Date)。)

    蛮力替代方法是扫描所有键是否符合您的条件。

    【讨论】:

    • "(如果这样做,不建议将该类基于已经定义这些方法的另一个类(例如 java.util.Date)。)" 为什么?
    • @Dejel 很确定这违反了合同。 java.util.Date#equals() 声明两个日期必须等于毫秒才能相等。
    【解决方案4】:

    不确定我是否正确。但是,您可以使用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));
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-12
      • 1970-01-01
      • 2015-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-01
      • 2019-08-11
      相关资源
      最近更新 更多