【问题标题】:sum of 2 elements in an array groupBy multiple values数组组中 2 个元素的总和按多个值
【发布时间】:2019-05-12 12:32:46
【问题描述】:

case class test(primary : String, secondary : Array[String], count : Int)

给定数组 a1:

a1: Array[test] = Array(test(Speed,Array(VR,ABC),5), test(Speed,Array.Empty[String],2), test(Speed,Array(Another,VR),3), test(Speed,Array(Another),3))

给定数组 a2:

a2: Array[test] = Array(test(Speed,Array(VR,ABC),6), test(Speed,Array.Empty[String],5), test(Speed,Array(Another),2), test(Speed,Array(SomethingElse),2))

我需要对计数求和并将其放在new Array[test] 中,按主要值和次要值分组。我该怎么做?这里计数是主要和次要组的总组合。这 2 个数组是从 2 个输入数据生成的统计信息。我的任务是汇总统计数据。

结果应该是:

a3: Array[test] = Array(test(Speed,Array(VR,ABC),11), test(Speed,Array.Empty[String],7),test(Speed,Array(Another),5),test(Speed,Array(Another,VR),3),test(Speed,Array(SomethingElse),2))

【问题讨论】:

  • 也许尝试使用 zip 和 map 来访问案例类的 count 属性?
  • 你可以对两个数组求和,按主次分组,你的键应该是一个元组,然后减少值求和,并返回所有减少的值。

标签: arrays scala collections


【解决方案1】:

如果您要求第一个数组包含相同数量的元素和相同的主/次对顺序(如您的示例),您也可以这样做:

val a3: Array[test] =
    a1.zip(a2)
      .map {
      case (test1, test2)
        if test1.primary == test2.primary &&
          test1.secondary == test2.secondary
      => test(test1.primary, test2.secondary, test1.count + test2.count))
      case _ => throw IllegalStateException
    }

如果不是,您可能会像 Okrm 建议的那样连接两个 list 和然后按主/辅助键分组:

val a3: Array[test] =
  (a1 ++ a2)
    .groupBy(test => (test.primary, test.secondary))
    .mapValues(_.map(_.count).sum)
    .map { case ((primary, secondary), count) => test(primary, secondary, count) }
    .toArray

对于给定的示例结果应该是相同的(除了顺序):

a3: Array[test] = Array(test(Speed,Another,5), test(Speed,VR,11), test(Speed,,7))

【讨论】:

  • 如果Secondary value不是String而是Array of String,应该如何修改?
  • 你能更准确一点吗?你的意思是次要可能是[VR,另一个]?在这种情况下计数是什么意思?您可能需要提供给定的输入以及您的期望。
  • count 在这种情况下意味着主组和辅助组的组合。
  • 您能给我举个预期结果的例子吗,我可能会有所帮助,但我仍然不知道您想要实现什么(可能在不同的主题中)。
  • 我刚刚更新了我的问题。请看一看。提前致谢。
【解决方案2】:

这应该可行:

val a3: Array[test] =
  (a1 ++ a2)
    .groupBy(test => (test.primary, test.secondary))
    .mapValues(_.map(_.count).sum)
    .map { case ((primary, secondary), count) => test(primary, secondary, count) }
    .toArray

结果是:

a3: Array[test] = Array(test(Speed,Another,5), test(Speed,VR,11), test(Speed,,7))

【讨论】:

  • 您需要使用toArray 将输出作为Array[test]
  • 如果Secondary value不是String而是Array of String,应该如何修改?
猜你喜欢
  • 1970-01-01
  • 2020-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多