我正在尝试为以下信息创建数据结构,应该在其中出现<1000次(可伸缩性非常好):
我可以在其中进行查询的地方,
我的第一个猜测(确实很丑)将是类似于的嵌套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
答案 0 :(得分:2)
为什么不简单地将单个项目存储在一个对象中,例如,DataPoint
具有time
,type
(例如login
)和{{ 1}}。
然后将它们相应地分组。如果它们在内存中,您甚至可以使用platform
的{{1}} 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()
(如果可以获取值)非常大。