我有一个问题需要解决,我需要在Java中创建一个会计和簿记解决方案(现在只是后端)。它们要求系统存储给定产品的先前价格,因此我决定使用HashMap<Date,Integer>
。
现在的问题是,系统必须能够在给定时间内检索价格,进行会计核算,追溯购买(订单存储物品和购买时间,因此可以轻松回顾)。这将是好事,但如果购买日期与价格设置日期不匹配,则简单的get方法返回null。到目前为止,我还没有能够找出在购买日期之前查找第一个上一个日期的搜索方法,以便返回价格。
有没有建议的方法来解决这个问题?
答案 0 :(得分:6)
我建议你查看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
答案 1 :(得分:2)
您需要的是使用TreeMap
,特别是方法NavigableMap#foorEntry(我的重点):
public Map.Entry floorEntry(K key)
从接口复制的描述:NavigableMap返回键值 与最大键小于或等于给定键关联的映射,如果没有这样的键则为null。
指定人: 接口NavigableMap中的floorEntry
答案 2 :(得分:0)
据我所知,你的地图键是日期。如果是这样,我建议您转到TreeMap
而不是HashMap
,并使用实现“最接近”日期逻辑的自定义比较器。当日期足够接近给定的比较器时,比较器的方法compare()
将返回0,而不需要完全匹配。