如何在scala中只对数组内的公共前缀的最大值求和



我在scala中有一个包含字符串项的数组,每个项包含从前缀+ || +双精度值,如下所示:

var y = Array("Zara||6.0", "Nuha||4.0","Zara||2.0","Zara||0.1")  

what I want Do:

我需要求和上面数组的所有双精度值(y(i).split("||")(1))但是如果前缀在数组中重复,那么我只需要像下面这样求和最大值:对于Zara,我们有3个值,我想取最大值(在我们的示例中是6.0)。对于项目Nuha是唯一的,那么我将取它的值(4.0)

异常输出(6.0 + 4.0) = 10.0

是否有任何方法可以在scala中做到这一点,而不是使用2代替循环?

准备你的数组:提取前缀和值到元组。使用foldLeft为每个前缀设置聚合最大元素,并对值求和

val res = y.map(_.split("\|\|")).map(arr => (arr(0), arr(1).toDouble))
.foldLeft(Map.empty[String, Double]) { (acc, elem) =>
val value = acc.get(elem._1).map(math.max(_, elem._2)).getOrElse(elem._2)
acc + (elem._1 -> value)
}.values.sum

println(res)

你可以在一个步骤中完成它(技术上是三个步骤,但只有一个专门解决你的需求,其他的一切(拆分和求和)都是给定的。

y
.iterator
.map(_.split("""||"""))
.groupMapReduce(_.head)(_.last.toDouble)(_ max _)
.values
.sum

也……不要使用变量。即使你只是拼凑了一个快速的样本。var是邪恶的,就假装它们根本不存在吧…至少在一段时间内,直到你掌握了足够的语言,能够分辨出1%的情况,在那里你可能真的需要他们。实际上,也尽量避免使用Array

相关内容

  • 没有找到相关文章

最新更新