1

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

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

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

4

3 回答 3

7

我建议你检查一下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
于 2012-12-08T11:50:24.053 回答
2

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

public Map.Entry floorEntry(K键)

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

指定者:接口 NavigableMap 中的 floorEntry

于 2012-12-08T12:11:45.487 回答
0

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

于 2012-12-08T11:51:37.150 回答