如何用两种归约操作实现Group、map和reduce处理元组
实现元组分组归约:求和+字符串列表拼接
你需要将相同第一个元素的三元组归约,同时完成数字求和与字符串列表收集,之前的代码仅处理了求和逻辑,补充字符串列表的收集即可实现需求。
方法一:使用groupBy处理
假设你的数据是一个Seq类型的集合:
val data = Seq(("T1",2,"x1"), ("T1",2,"x2"), ("T2",3,"y1"))
通过groupBy按第一个元素分组后,分别处理求和和列表收集:
val result = data.groupBy(_._1).map { case (key, tuples) => // 对分组内的第二个元素求和 val total = tuples.map(_._2).sum // 提取分组内的第三个元素并转为List val strList = tuples.map(_._3).toList // 组合成目标三元组 (key, total, strList) }
执行后result的结果为:
Map(T2 -> (3, List(y1)), T1 -> (4, List(x1, x2)))
方法二:使用foldLeft逐步累积(适合大数据量)
如果需要避免groupBy的中间集合生成,可通过foldLeft直接累积结果,还能控制字符串列表的顺序:
val result = data.foldLeft(Map.empty[String, (Int, List[String])]) { (acc, (key, num, str)) => acc.get(key) match { case Some((currentSum, currentList)) => // 已有该key,更新求和结果并追加字符串 acc + (key -> (currentSum + num, str :: currentList)) case None => // 首次遇到该key,初始化求和值和列表 acc + (key -> (num, List(str))) } }.map { case (key, (sum, list)) => // 反转列表以保持原数据中的顺序(不需要可省略reverse) (key, sum, list.reverse) }
内容的提问来源于stack exchange,提问作者Sam Sam
相关产品推荐
相关产品推荐

