Map和 order的组合List呢?该地图有一个复合键userIdand measureName,值是日期范围和 double 的排序列表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必须实现hashCode()和equals()使用其成员userId和measureName. Entry如果一个范围是另一个范围的一部分,则必须实现Comparable<Entry>wherecompareTo()必须返回 0(startDate 比较 <= 0 并且 endDate 比较 >= 0 或 0 如果 startDate 比较 >= 0 并且 endDate 比较 <= 0)否则比较 startDate+ (endDate-startDate)/2 (范围的中间)与 double 无关value。
如果您主要阅读而不修改此结构,它应该很快。如果使用较多,比较将被编译为本机。如果该功能仅适用于单个用户并进行度量,则可以仅使用排序列表,如果仅适用于单个用户,则可以创建 Map<UserId<Map<MeasureName,List<Entry>>>>类似的结构。
首先尝试一个简单的解决方案,前后测量,仅在需要时进行性能优化。