【问题标题】:Java look up closest previous Date in HashMapJava在HashMap中查找最接近的上一个日期
【发布时间】:2012-11-26 11:04:18
【问题描述】:

我有一个问题要解决,我需要在 Java 中创建一个会计和簿记解决方案部分(现在只是后端)。他们要求系统存储给定产品的先前价格,所以我决定使用HashMap<Date,Integer>

现在的问题是,系统必须能够检索给定时间的价格,用于记账,追溯购买(订单存储商品和购买时间,因此可以轻松回顾)。一切都会好的,但是如果购买日期与定价日期不匹配,那么简单的 get 方法会返回 null。到目前为止,我还无法逻辑出一种搜索方法,该方法查找购买日期之前的第一个上一个日期,以返回价格。

有什么建议的方法来解决这个问题吗?

【问题讨论】:

  • 哈希图中的键/值类型是什么?
  • 嗯,系统出于某种原因删除了它,但它是Date和Integer。
  • 它没有删除它们——它们被隐藏为 html。输入尖括号时,将术语用反引号括起来(编辑你的帖子,看看我是如何为你做的)。此外,没有理由在“解决方案”一词中加上撇号(我也删除了)

标签: java date search hashmap


【解决方案1】:

你需要的是使用TreeMap,特别是方法NavigableMap#foorEntry(我的重点):

public Map.Entry floorEntry(K键)

从接口复制的描述:NavigableMap 返回一个键值 与小于或等于给定键的最大键关联的映射,如果没有这样的键,则为 null。

指定者: 接口 NavigableMap 中的 floorEntry

【讨论】:

    【解决方案2】:

    我建议您查看TreeMap

    要获得date 之前最接近的日期,您可以这样查找:

    return map.get(map.headMap(date, true).lastKey());
    

    以上内容的分解:

    • previous = map.headMap(date, true) 返回所有以前的条目(包括日期)
    • closestMatchingKey = previous.lastKey() 返回该(上)映射中的最后一个键
    • map.get(closestMatchingKey) 返回匹配项(或 null 如果没有)

    示例:

    public static void main(String[] args) {
    
        TreeMap<Date, String> map = new TreeMap<>();
    
        map.put(new Date(0), "First");
        map.put(new Date(10), "Second");
        map.put(new Date(20), "Third");
        map.put(new Date(30), "Fourth");
        map.put(new Date(40), "Fifth");
    
        System.out.println(getClosestPrevious(map, new Date(5)));
        System.out.println(getClosestPrevious(map, new Date(10)));
        System.out.println(getClosestPrevious(map, new Date(55)));
    }
    
    private static String getClosestPrevious(TreeMap<Date, String> map, Date date) {
        return map.get(map.headMap(date, true).lastKey());
    }
    

    输出:

    First
    Second
    Fifth
    

    【讨论】:

    • 谢谢,这似乎是迄今为止最好的解决方案,也是最容易实现的!
    【解决方案3】:

    据我了解,您地图的键是日期。如果是这样,我建议您移至TreeMap 而不是HashMap 并使用实现“最近”日期逻辑的自定义比较器。当日期与给定的日期足够接近而不需要精确匹配时,比较器的方法compare() 将返回 0。

    【讨论】:

    • 是的,TreeMap 似乎是一个更好的解决方案,虽然请注意我不必找到“最近”的日期,而是“最近的前一个”。但是是的,逻辑应该差不多。
    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 2018-06-04
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    相关资源
    最近更新 更多