Qu'en est-il d'une combinaison de Map
et de List
? La carte a une clé composée de userId
et measureName
, la valeur est une gamme liste de date triée et 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
doit mettre en œuvre hashCode()
et equals()
utilisant ses membres userId
et measureName
. Entry
doit Comparable<Entry>
où compareTo()
doit retourner 0 si une plage fait partie de l'autre (comparaison startDate est < = 0 et la comparaison endDate est> = 0 ou 0 si la comparaison startDate est> = 0 et la comparaison endDate est < = 0) Sinon, comparez startDate + (endDate-startDate)/2 (milieu de la plage) quel que soit le double value
.
Si vous lisez et ne modifiez pas cette structure, elle devrait être rapide. La comparaison sera compilée en natif si elle est utilisée beaucoup. Si la fonction fonctionne sur un seul utilisateur et mesure uniquement, vous pouvez uniquement utiliser la liste triée, si seulement sur un seul utilisateur, vous pouvez créer une structure similaire à Map<UserId<Map<MeasureName,List<Entry>>>>
.
Essayez d'abord une solution simple, mesurez avant et après, effectuez les optimisations de performance seulement si nécessaire.
Combien d'entrées êtes-vous susceptible d'avoir pour chaque combinaison utilisateur/mesure? –
Si vous pensez à smart metering/timeseries pas d'entre eux. Trouver une autre solution Semblable aux timeseries –
pas trop, disons 100, le problème est que cela demande beaucoup de temps. (80k fois pour une fonction appelée assez souvent) – user2088834