2010-05-13 61 views
1

我需要的是类似于Hashtable的东西,我将填入所需日期的实际价格。我需要数据结构来有效处理日期

例如:我会把两个价格:1月1日:100USD,3月5日:89USD。

如果我搜索我的散列表的价格:hashtable.get(2月14日)我需要它给我回到1月1日输入的实际价格,因为这是最后一个实际价格。正常的哈希表实现不会给我任何回报,因为没有任何东西放在那个dat上。

我需要看看是否有这样的实现,可以根据日期范围快速找到对象。

回答

5

关于我的头顶,有几种方法,但我会使用TreeMap<Date>(或Calendar等)。

当你需要拔出Date date,请尝试以下操作:

  1. 尝试get(date)
  2. 如果结果是null,那么结果是headMap(date).lastKey()

其中之一将工作。当然,首先检查headMap(date)的大小,因为如果它是空的,lastKey()将抛出Exception

+2

+1这是正确的做法。可以用Java 6改进一点,使用TreeMap.floorEntry(date) – 2010-05-13 12:27:37

+0

感谢floorEntry的提示! – Phil 2010-05-13 12:35:44

+0

+1不知道“TreeMap”的这个特性! – 2010-05-13 16:01:25

0

您可以使用包含两者的DatePrice对象,并将它们保存在按日期排序的列表或数组中,然后使用二分查找(可在CollectionsArrays类中找到)来查找最近的日期。

这会比使用TreeMap显着提高内存效率,并且您不希望随机插入或移除数据(这会导致数组性能下降)。

+0

没有..只需要填充数据库中的价格缓存,所以我不必在任何时候打一次数据库,我需要在某个随机日期的产品价格。价格不会每天都在变化,也许在一个月内会发生一次变化,关键在于快速找到10年前某个日期的价格。 – 2010-05-13 09:49:13

0

用日期,字符串创建树图。如果有人要求日期,则将字符串转换为日期并调用map.get(date),如果发现则使用前一个键而不是当前元素。

0

您已经拥有了所有的工具。考虑一个TreeMap。然后,您可以创建一个头像,该头像仅包含地图中严格低于给定值的部分。实现示例:

TreeMap<Date,Double> values = new TreeMap<Date,Double>(); 
...fill in stuff... 
Date searchDate = ...anydate... 
// Needed due to the strictly less contraint: 
Date mapContraintDate = new Date(searchDate.getTime()+1); 
Double searchedValue = values.get(values.headMap(mapContraintData).lastKey); 

这是有效的,因为中的headMap不被复制原始地图创建,但只返回一个视图。

相关问题