Map
和订购List
的组合怎么样?该变换图具有的userId
和measureName
复合键,则该值的日期范围和双value
的排序的列表:
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;
Key
具有使用其成员userId
和measureName
实施hashCode()
和equals()
。 Entry
必须实现Comparable<Entry>
其中compareTo()
如果一个范围是另一个范围的一部分,则返回0(如果startDate比较> = 0且endDate比较为< = 0,则startDate比较为< = 0且endDate比较> = 0或0)否则比较startDate +(endDate-startDate)/ 2(范围的中间),无论双重value
。
如果您主要阅读并且不修改此结构,它应该很快。如果使用太多,比较将被编译为本地。如果该功能仅适用于单个用户并且只能测量,则只能使用排序列表,如果只有单个用户,则可以创建Map<UserId<Map<MeasureName,List<Entry>>>>
类似结构。
先尝试一个简单的解决方案,然后进行测量,只在需要时进行性能优化。
您对每个用户/度量组合可能有多少个条目? – 2013-03-12 21:54:41
如果你不考虑智能计量/时间系列。寻找其他解决方案类似于时间序列 – 2013-03-12 21:56:28
不算太多,比方说100,问题在于问了很多时间。 (对于经常被调用的函数,80k次) – user2088834 2013-03-12 21:56:50