【问题标题】:Scala - aggregating tuplesScala - 聚合元组
【发布时间】:2018-05-10 22:33:39
【问题描述】:

我有一个元组列表:

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))

字符串是服务器标识符,数字与服务器负载有关,每个元组代表一个访问服务器的项目。

我需要将此列表聚合为:

List(serverNameString, accessCountInt, serverLoadInt)

结果应该是这样的:

List(
    ("AS-4019", 3, 171),
    ("BR-5722", 4, 2328),
    ("SQ-9985", 3, 192),
    ("GN-1070", 2, 9206))

我尝试过使用一些地图和过滤器,但它似乎过于复杂而且也不起作用。

val aggregatedList = for(v <- lisinputt.distinct) {
    (v, lisinputt.groupBy(identity).mapValues(_.size)(v))
}

【问题讨论】:

  • serverList.groupBy(_._1).map {case (key, values) =&gt; (key, values.length, values.map(_._2).sum) }
  • @XavierGuihot 一个非常干净简洁的解决方案。

标签: scala tuples aggregate


【解决方案1】:

对于输入列表

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))

这可以通过

来实现
serverList.groupBy(_._1).map {
  x => ( x._1, x._2.size , x._2.map(_._2).sum )
}

这将以

的形式为您提供结果
res0: scala.collection.immutable.Iterable[(String, Int, Int)] = List((AS-4019,3,171), (SQ-9985,3,192), (BR-5722,4,2328), (GN-1070,2,9206))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多