如何在scala集合中找出每个键的最大值

时间:2016-06-23 19:04:24

标签: scala

让我们考虑一下,我将一些名队员列为元组列表,其中t._1表示部门ID,t._2表示工资,t._3表示员工姓名

val eployees = List((1, 8000, "Sally"),(1, 9999, "Tom"), (2, 5000, "Pam"), (4, 500, "NK"), (4, 999, "Robert"))

预期结果:-((2,5000,Kumar), (4,999,Robert), (1,9999,Ashok))

我正在尝试,但得到错误,

val maxSal1 = emps.map(t => (t._1, (t._2, t._3))).groupBy(a => a._1).map(k => {
  k._2.foldLeft(0, "dummy")((aa, bb) => {
    if (aa._1 > bb._1) aa else bb
  })
})

3 个答案:

答案 0 :(得分:4)

不要过分复杂,避免做不必要的操作,并携带冗余信息。只需明确,并说明每一步所需的转换。简单就是你的朋友。

employees.groupBy(_._1).values.map(_.maxBy(_._2))

答案 1 :(得分:2)

scala> List((1, 8000, "Sally"),(1, 9999, "Tom"), (2, 5000, "Pam"), (4, 500, "NK"), (4, 999, "Robert")).groupBy { 
     |  case (dept, salary, employee) => dept
     | }
res6: scala.collection.immutable.Map[Int,List[(Int, Int, String)]] = Map(2 -> List((2,5000,Pam)), 4 -> List((4,500,NK), (4,999,Robert)), 1 -> List((1,8000,Sally), (1,9999,Tom)))

scala> res6.map { 
     |  case (dept, employees) => employees.maxBy(_._2)
     | }
res5: scala.collection.immutable.Iterable[(Int, Int, String)] = List((2,5000,Pam), (4,999,Robert), (1,9999,Tom))

但请注意maxBy是部分功能:

scala> List[Int]().maxBy(x => x)
java.lang.UnsupportedOperationException: empty.maxBy

作为旁注,我将case class Employee与3个字段而不是元组一起使用。我相信它更具可读性。

答案 2 :(得分:0)

我尝试了这个选项,似乎给出了结果,

val maxsal1 = emps1.map(t => (t._1, t._2, t._3)).groupBy(_._1).values.map(t => t.foldLeft((0, 1, "dummy"))((aa, bb) => {
      if (aa._2 > bb._2) aa else bb
    }))

输出:List((2,5000,Pam), (4,999,Robert), (1,9999,Tom))