Scala:元组列表聚合需求及实现问题求助
如何在Scala中聚合服务器访问数据列表
嘿,我来帮你搞定这个聚合需求!你的目标是按服务器标识分组,统计每个服务器的访问次数和总负载,Scala的集合API其实有非常简洁的实现方式,不用绕复杂的map+filter组合。
正确实现代码
val serverList = List( ("AS-4019", 100), ("BR-5722", 2080), ("SQ-9985", 70), ("BR-5722", 82), ("BR-5722", 147), ("AS-4019", 7), ("SQ-9985", 29), ("AS-4019", 64), ("SQ-9985", 93), ("GN-1070", 1408), ("BR-5722", 19), ("GN-1070", 7798)) val aggregatedList = serverList .groupBy(_._1) // 按服务器标识分组,生成Map[String, List[(String, Int)]] .map { case (serverName, entries) => val accessCount = entries.size // 统计该服务器的访问次数 val totalLoad = entries.map(_._2).sum // 计算所有访问的负载总和 (serverName, accessCount, totalLoad) } .toList // 转换为目标List格式
代码分步解释
groupBy(_._1):这一步是核心,它把原始列表按元组的第一个元素(服务器标识)分组,得到一个Map——键是服务器名称,值是该服务器对应的所有访问记录组成的列表。map遍历分组结果:对Map中的每个键值对进行解构,分别拿到服务器名和对应的访问记录列表:entries.size直接获取该服务器被访问的次数;entries.map(_._2).sum先提取每条记录的负载值,再求和得到总负载;- 最后把这三个值组合成你需要的三元组格式。
toList:把Map转换成你要求的List类型,完成最终转换。
你之前代码的问题分析
你之前尝试用groupBy(identity),这会按整个元组来分组,也就是说只有完全相同的元组才会被分到一组,而不是按服务器名聚合不同的访问记录,这就导致没法统计同一服务器的总访问次数和负载,自然得不到预期结果啦。
运行上面的代码后,你会得到完全符合预期的结果:
List(("AS-4019", 3, 171), ("BR-5722", 4, 2328), ("SQ-9985", 3, 192), ("GN-1070", 2, 9206))
内容的提问来源于stack exchange,提问作者crowgers
相关产品推荐
相关产品推荐

