Java8 - вложенная структура данных для нескольких критериев поиска - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь создать структуру данных для следующей информации, где у меня должно быть <1000 случаев (хотя масштабируемость была бы очень хорошей): </p>

  • Время
  • Сервер
  • Стат
  • Итого

Где я могу делать запросы, такие как:

  1. Что такое ИТОГО для STAT по SERVER
  2. Что такое ВСЕГО для SERVER по STAT

Моим первым предположением (действительно уродливым) будет вложенный HashMap, похожий на

HashMap<Long, HashMap<String, HashMap<String, Integer>>

Каков наилучший способ реализации вышеизложенного?Я скучаю по более широкой картине, и мне следует изменить способ хранения данных?

РЕДАКТИРОВАТЬ: пример использования будет выглядеть следующим образом:

Time  | Stat   | Server  | Platform | Count
11:00 | Logins | Server1 | Android  | 10
11:00 | Logins | Server2 | IOS      | 5
12:00 | ERRORS | Server14| IOS      | 8

1 Ответ

0 голосов
/ 20 ноября 2018

Почему бы вам просто не сохранить отдельные элементы в объекте, например DataPoint, который имеет time, type (например, login) и platform.

Затем сгруппируйте их соответственно.Если они находятся в памяти, вы даже можете использовать Stream groupingBy Collector и делать counting() для подсчета всех вхождений каждой группы.

Так что если у вас есть List<DataPoint> list, вы можете сделать:

Map<String, Long> countsByType = list.stream()
    .collect(Collectors.groupingBy(DataPoint::getType, Collectors.counting()));


Map<String, Long> countsByPlatform = list.stream()
     .collect(Collectors.groupingBy(DataPoint::getPlatform, Collectors.counting()));

Я не уверен точно, как Long времени входит в историю, но если вы хотите сгруппировать их по часам или что-то в этом роде, вы можете сделать то же самое снова до того, каквыше.

Если DataPoint собирается уже содержать агрегаты, например total, вы можете заменить Collectors.counting() на Collectors.summingInt(DataPoint::getTotal) или аналогично Collectors.summingLong(), если значения могут стать очень большими.

...