Java8-多搜索标准的嵌套数据结构

Java8-多搜索标准的嵌套数据结构,java,data-structures,java-8,time-series,maps,Java,Data Structures,Java 8,Time Series,Maps,我正在尝试为以下信息创建一个数据结构,其中我应该有为什么您不简单地将单个项存储在一个对象中,例如数据点,它具有时间,类型(例如登录)和平台 然后将它们相应地分组。如果它们在内存中,您甚至可以使用Stream的groupingByCollector和docounting()来计算每个组的所有出现次数 因此,如果您有列表,您可以: Map<String, Long> countsByType = list.stream() .collect(Collectors.grouping

我正在尝试为以下信息创建一个数据结构,其中我应该有为什么您不简单地将单个项存储在一个对象中,例如
数据点
,它具有
时间
类型
(例如
登录
)和
平台

然后将它们相应地分组。如果它们在内存中,您甚至可以使用
Stream
groupingBy
Collector
和do
counting()
来计算每个组的所有出现次数

因此,如果您有
列表
,您可以:

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()));
Map countsByType=list.stream()
.collect(Collectors.groupingBy(DataPoint::getType,Collectors.counting());
Map countsbypplatform=list.stream()
.collect(Collectors.groupingBy(DataPoint::getPlatform,Collectors.counting());
我不确定时间的
长度是如何进入故事的,但是如果你想按小时或类似的方式对他们进行分组,你可以在上述时间之前再做同样的事情


如果
DataPoint
已经包含聚合,如
total
,则可以将
收集器.counting()
替换为
收集器.summingit(DataPoint::getTotal)
或类似的
收集器.summingLong()
如果值可能变得非常大。

我想也许guavas MultiMap或googles Table会有用也许会维护一个自定义对象的集合(如列表),并有两个映射用于索引它?长的
表示第一个映射的键是什么?你能给我一个小的示例数据集吗?@daniu我已经添加了一个示例数据集,我认为我最初的解释没有完全涵盖为什么首先要使用Java?把它放在数据库中,用sql可以很容易地进行这类查询。谢谢@jbx,我现在正在阅读关于
groupingBy
。我需要以图表格式显示结果。因此,拥有POJO可能会使事情变得更容易。是的,我还需要以图表格式输出数据,因此需要时间。我发现您的解决方案存在的问题是,它会计算
数据点
对象的数量。但是我需要得到所有在“平台”上匹配的
数据点
对象,然后计算它们的“总数”。每个“数据点”都有其相关统计数据的总数,例如,匹配的
DataPoint
的登录次数如果
DataPoint
将成为一个集合,其中包含
total
,您只需使用
summingit(DataPoint::getTotal)
而不是
counting()
Time  | Stat   | Server  | Platform | Count
11:00 | Logins | Server1 | Android  | 10
11:00 | Logins | Server2 | IOS      | 5
12:00 | ERRORS | Server14| IOS      | 8
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()));