сумма 2 элементов в массиве groupBy с несколькими значениями - PullRequest
0 голосов
/ 11 декабря 2018

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] сгруппированы по первичным и вторичным значениям.Как мне это сделать?Здесь count - общая комбинация первичной и вторичной группы.Эти 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))

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

Если вам требуется, чтобы первый массив содержал одинаковое количество элементов с одинаковым порядком первичных / вторичных пар (как в примере с вами), вы также можете сделать что-то подобное:

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
    }

Если нет, вывероятно, объединит оба списка s и затем группу по первичному / вторичному ключу, как предложил Okrm:

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))
0 голосов
/ 11 декабря 2018

Это должно работать:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...