You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:59:08