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
和docounting()
来计算每个组的所有出现次数
因此,如果您有列表
,您可以:
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()));