Почему бы вам просто не сохранить отдельные элементы в объекте, например 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()
, если значения могут стать очень большими.