と の組み合わせはどうMap
でしょList
うか。マップには and の複合キーがuserId
あり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()
して使用する必要があります。一方の範囲が他方の範囲の一部である場合、0 を返さなければならない場所を実装する必要があります (startDate の比較が <= 0 で endDate の比較が >= 0 の場合、または startDate の比較が >= 0 で endDate の比較が <= 0 の場合は 0)。 (endDate-startDate)/2 (範囲の中央) double に関係なく。equals()
userId
measureName
Entry
Comparable<Entry>
compareTo()
value
この構造をほとんど変更せずに読み取りを行う場合、高速になるはずです。比較は多用するとネイティブにコンパイルされます。関数が 1 人のユーザーとメジャーのみで機能する場合は、並べ替えられたリストのみを使用できます。1 人のユーザーのみで機能する場合は、 Map<UserId<Map<MeasureName,List<Entry>>>>
代わりに like 構造を作成できます。
最初に簡単な解決策を試し、前後に測定し、必要な場合にのみパフォーマンスの最適化を行います。