让我们考虑一下,我将一些名队员列为元组列表,其中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
})
})
答案 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))