【问题标题】:Top 3 value from each group in scala listsscala 列表中每个组的前 3 个值
【发布时间】:2022-06-15 01:54:42
【问题描述】:

我是 scala 语言的新手。

我有两个 scala 列表 emp(empid,deptid,empname,salary) 和 dept(deptname,deptid)。我想找出每个部门的前 3 名薪水。

val emp =
   List(
      (1,"10","Smith",3000),
      (1,"10","Smith",3000),
      (3,"10","Williams",1000),
      (4,"10","Jones",2000),
      (5,"10","Brown",5000),
      (6,"20","Brown",8000),
      (7,"10","Jones",11000),
      (8,"20","Brown",5000),
      (9,"20","Brown",8000)
   )

val dept = 
  List(
      ("Finance","10"),
      ("Marketing","20")
  )

输出应包含财务部门的前 3 名薪水和营销部门的前 3 名薪水。在不使用 spark 函数的情况下帮助我解决这个问题。

【问题讨论】:

  • 到目前为止你有什么尝试?
  • 所以,我会帮助你解决算法,但你必须弄清楚代码。在emp 列表中使用groupMap 得到一个部门的所有薪水,然后在结果上使用.view.mapValues 对列表进行排序,然后尝试取前三个元素。最后,将dept 列表转换为地图,并使用它对上一个结果进行最终的map,以从代码中获取部门名称。

标签: scala


【解决方案1】:

为了可读性和简洁性,您应该将emp List 建模为Listcase class Persona。然后你就可以直观的弄清楚剩下的代码了。

您可以使用 groupBy 创建 deptId -> List[Persona]Map ,然后按薪水排序,只取您感兴趣的第一个 n 薪水,并处理列表以使其与确切匹配你需要的输出。

顺便说一句,我推荐deptId 成为Int,就像Personaid

代码如下:

case class Persona(id: Int, deptId: String, name: String, sal: Int)

object Program {

  def main(args: Array[String]): Unit = {

    val emp =
      List(
        (1, "10", "Smith", 3000),
        (1, "10", "Smith", 3000),
        (3, "10", "Williams", 1000),
        (4, "10", "Jones", 2000),
        (5, "10", "Brown", 5000),
        (6, "20", "Brown", 8000),
        (7, "10", "Jones", 11000),
        (8, "20", "Brown", 5000),
        (9, "20", "Brown", 8000)
      )

    val dept =
      List(
        ("Finance", "10"),
        ("Marketing", "20")
      )

    val personas = emp.map { case (id, deptId, name, salary) =>
      Persona(id, deptId, name, salary)
    }

    val myMap: Map[String, List[Persona]] = personas.groupBy(_.deptId)

    def topNSalariesGroupedBy(n: Int, deptId: String): String =
      myMap(deptId).sortWith(_.sal > _.sal).take(n).map(_.sal).mkString(", ")

    val n = 3
    dept.foreach(dept =>
      println(
        s"Top $n salaries from department ${dept._1} are: ${topNSalariesGroupedBy(n, dept._2)}"
      )
    )

  }
}

输出:

Top 3 salaries from department Finance are: 11000, 5000, 3000
Top 3 salaries from department Marketing are: 8000, 8000, 5000

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    相关资源
    最近更新 更多