我需要的是类似于Hashtable的东西,我将填入所需日期的实际价格。我需要数据结构来有效处理日期
例如:我会把两个价格:1月1日:100USD,3月5日:89USD。
如果我搜索我的散列表的价格:hashtable.get(2月14日)我需要它给我回到1月1日输入的实际价格,因为这是最后一个实际价格。正常的哈希表实现不会给我任何回报,因为没有任何东西放在那个dat上。
我需要看看是否有这样的实现,可以根据日期范围快速找到对象。
我需要的是类似于Hashtable的东西,我将填入所需日期的实际价格。我需要数据结构来有效处理日期
例如:我会把两个价格:1月1日:100USD,3月5日:89USD。
如果我搜索我的散列表的价格:hashtable.get(2月14日)我需要它给我回到1月1日输入的实际价格,因为这是最后一个实际价格。正常的哈希表实现不会给我任何回报,因为没有任何东西放在那个dat上。
我需要看看是否有这样的实现,可以根据日期范围快速找到对象。
关于我的头顶,有几种方法,但我会使用TreeMap<Date>
(或Calendar
等)。
当你需要拔出Date date
,请尝试以下操作:
get(date)
null
,那么结果是headMap(date).lastKey()
其中之一将工作。当然,首先检查headMap(date)
的大小,因为如果它是空的,lastKey()
将抛出Exception
。
您可以使用包含两者的DatePrice
对象,并将它们保存在按日期排序的列表或数组中,然后使用二分查找(可在Collections
和Arrays
类中找到)来查找最近的日期。
这会比使用TreeMap
显着提高内存效率,并且您不希望随机插入或移除数据(这会导致数组性能下降)。
没有..只需要填充数据库中的价格缓存,所以我不必在任何时候打一次数据库,我需要在某个随机日期的产品价格。价格不会每天都在变化,也许在一个月内会发生一次变化,关键在于快速找到10年前某个日期的价格。 – 2010-05-13 09:49:13
用日期,字符串创建树图。如果有人要求日期,则将字符串转换为日期并调用map.get(date),如果发现则使用前一个键而不是当前元素。
您已经拥有了所有的工具。考虑一个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不被复制原始地图创建,但只返回一个视图。
+1这是正确的做法。可以用Java 6改进一点,使用TreeMap.floorEntry(date) – 2010-05-13 12:27:37
感谢floorEntry的提示! – Phil 2010-05-13 12:35:44
+1不知道“TreeMap”的这个特性! – 2010-05-13 16:01:25