gpt4 book ai didi

scala - 如何递归获取 Scala map 中包含的每个列表的最后一个元素?

转载 作者:行者123 更新时间:2023-12-02 01:18:57 24 4
gpt4 key购买 nike

我是 Scala 的新手,想知道如何递归地从 map 中包含的每个列表中获取最后一个元素。 map 中包含的数据是从一个文本文件中读取的,该文件包含有关过去 5 个赛季的足球队及其积分统计的信息:

   Manchester United, 72, 86, 83, 90, 94
Manchester City, 80, 84, 91, 77, 88
Chelsea, 76, 85, 92, 87, 84
Arsenal, 70, 79, 81, 76, 83
Liverpool, 69, 77, 80, 73, 79

数据存储为 Map[String, List[Int]],我希望返回一个 Map[String, Int] 类型的 map ,它将为我提供每个团队的最新积分统计,例如Manchester United:94,Manchester City:88 等。我目前正在设法通过反转列表并获得头部来实现这一点,如下所示。我将如何递归执行此操作?

  val teamdata = readTextFile("teams.txt")

def menuOptionOne(): Boolean = {
//1 - Show most recent points tally for each team
menuMostRecent(mostRecentPoints)
true
}


def readTextFile(file: String): Map[String, List[Int]] = {
var mapBuilder: Map[String, List[Int]] = Map()
try {
for (line <- Source.fromFile(file).getLines()) {
val linesplit = line.split(",").map(_.trim).toList
mapBuilder = mapBuilder ++ Map(linesplit.head -> linesplit.tail.map(_.toInt))
}
}
catch {
case ex: Exception => println("Exception Thrown")
}
mapBuilder
}


def menuMostRecent(f: () => Map[String, Int]) = {
f() foreach {case (x,y) => println(s"$x: $y")}
}


def mostRecentPoints():Map[String, Int] = {
ListMap(teamdata.mapValues(_.reverse.head).toSeq.sortBy(_._1):_*)
}

最佳答案

一种明确强调递归方法的方法是定义一个小函数来使用递归获取列表中的最后一个元素,如下所示:

  def recList(l : List[Int]) : Int = l match {
case Nil => throw new Exception("Empty list")
case x :: Nil => x
case x :: xs => recList(xs)
}

这也是利用 Scala 的模式匹配工具来解构列表。那么这只是在您的 map 上调用此函数的情况:

res8: scala.collection.immutable.Map[String,List[Int]] = Map(MU -> List(10, 20, 30), MC -> List(50, 55, 60))

scala> s.mapValues(recList)
res9: scala.collection.immutable.Map[String,Int] = Map(MU -> 30, MC -> 60)

关于scala - 如何递归获取 Scala map 中包含的每个列表的最后一个元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41295821/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com