Iterable上的foldLeft(String,(Long,Long))

时间:2017-03-17 14:46:07

标签: scala fold

因此。情形:

我有这样的清单:

("USER1",(24,11))
("USER2",(10,7))
("USER2",(1,10))
("USER1",(2,3))
("USER3",(3,4))

我需要groupBy每个用户的所有信息,然后汇总每个元组的信息。

所以我的预期输出是:

("USER1",(26,14))
("USER2",(11,17))
("USER3",(3,4))

我用以下代码实现了这个目标:

userInfo.groupBy(elem => elem._1).map(_._2).map { user =>
              {
                val sums = user.foldLeft(("", (0L, 0L)))((acc, newElem) =>
                  (acc._1,
                   (acc._2._1 + newElem._2._1, acc._2._2 + newElem._2._2)))
              }
          (user._1,sums)
       }

其中userInfoIterable[String,(Long,Long)] 正如你所看到的,我使用了foldLeft,我几乎忽略了每个元组的第一个元素,因为我并不关心foldLeft。

我很想知道,因为我发现它的代码非常糟糕,主要是因为这个带有空字符串的foldLeft,是否有更好的解决方案呢?

2 个答案:

答案 0 :(得分:3)

也许这样,你可以在这种情况下使用 reduce 而不是 foldLeft

def sumOp(x: (Int, Int), y: (Int, Int)): (Int, Int) = (x._1 + y._1, x._2 + y._2)

userInfo.groupBy(_._1).mapValues(user => user.map{ case (u, x) => x }.reduce(sumOp))
// res52: scala.collection.immutable.Map[String,(Int, Int)] = Map(USER2 -> (11,17), USER1 -> (26,14), USER3 -> (3,4))

答案 1 :(得分:3)

使用<div class='wrapper'> <input type="text" class="test1" /> <input type="text" class="test2" /> </div>和简单的mapValues

reduce