Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 具有日期范围的HashMap_Java_Data Structures_Hashmap - Fatal编程技术网

Java 具有日期范围的HashMap

Java 具有日期范围的HashMap,java,data-structures,hashmap,Java,Data Structures,Hashmap,我需要基于多键快速查找一些值。 密钥由以下部分组成: 这个值是双精度的 问题是,我必须询问指示日期的值,而不是日期范围。 因此,如果我需要一个用户ID、一个measureName和一天,那么数据结构必须回答日期介于startDate和endDate之间的值(日期范围之间没有重叠) 我无法理解哪种数据结构更适合实现此功能。哈希映射?树地图?多键映射?地图?救命!:) 我认为您应该使用树形图和以下方法: 但在比较函数中只使用一个日期-开始日期或结束日期。由于这些范围不重叠,所以这不应该是一个问题,

我需要基于多键快速查找一些值。 密钥由以下部分组成:
这个值是双精度的

问题是,我必须询问指示日期的值,而不是日期范围。 因此,如果我需要一个
用户ID
、一个
measureName
和一天,那么数据结构必须回答日期介于
startDate
endDate
之间的值(日期范围之间没有重叠)


我无法理解哪种数据结构更适合实现此功能。哈希映射?树地图?多键映射?地图?救命!:)

我认为您应该使用树形图和以下方法: 但在比较函数中只使用一个日期-开始日期或结束日期。由于这些范围不重叠,所以这不应该是一个问题,可以使用TreeMap中提到的方法


例如:如果您决定在比较中使用
endDate
(以及除其他日期以外的其他字段),则最好使用带有自定义键对象的方法
floorrentry
树映射。你会有类似于:

...
TreeMap<MyMultiKey,Double> map = ...

class MyMultiKey implements Comparable<MyMultiKey>{
...
}
。。。
树映射=。。。
类MyMultiKey实现了可比较的{
...
}

假设
MyMultiKey
compareTo
方法已实现,可以在每次需要搜索特定日期时,使用
map.floorKey(MyMultiKey m)
map.higherKey(MyMultiKey m)创建一个新的
MyMultiKey
实例
以确保您找到的密钥的开始和结束时间包含您在新密钥实例中指定的日期。

我建议为用户/度量部分密钥提供一些映射。 该值将是元组的排序数组(日期范围,floatval)。
在此数组中,您对包含日期的日期范围执行二进制搜索。

Map
和ordered
List
结合使用如何?地图上有一个复合键
userId
measureName
,该值是日期范围和双
值的排序列表:

Map<Key,List<Entry>> data = new HashMap<>();
List<Entry> entries = data.get(new Key(userId, measureName));
int i = Collections.binarySearch(entries, new Entry(searchDate,searchDate, 0.0));
double value = i < 0 ? 0.0 : entries.get(i).value;
Map data=newhashmap();
列表条目=data.get(新键(userId,measureName));
inti=Collections.binarySearch(条目,新条目(searchDate,searchDate,0.0));
双值=i<0?0.0:entries.get(i).value;

Key
必须使用其成员
userId
measureName
实现
hashCode()
equals()
<代码>条目
必须实现
可比
其中
compareTo()
必须返回0,如果一个范围是另一个范围的一部分(startDate comparison=0或0,如果startDate comparison>=0,endDate comparison是指每个用户/度量值组合可能有多少个条目?如果您考虑智能计量/时间序列,则没有。找到其他解决方案。类似于时间序列没有太多,比如说100,问题是需要花费大量时间。(对于经常调用的函数,为80k次)日期范围有多大?可能只需为范围内的每个日期创建一个条目。这是旧的记忆与速度决定。番石榴?虽然没有重叠,但可能有不在开始/结束日期范围内的日期……但您应该只需要比较一次结束日期。@jahroy哦,我明白了;我误解并认为是suggestion将日期直接用作地图键。