繁体   English   中英

如何以递归方式获取Scala中地图中包含的每个列表的最后一个元素?

[英]How to recursively get the last element of each list contained within a map in Scala?

我是Scala的新手,想知道如何以递归方式从地图中包含的每个列表中获取最后一个元素。 地图中包含的数据是从一个文本文件中读取的,该文件包含过去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]类型的地图,它将为我提供每个团队的最新点数,例如曼联:94,曼彻斯特城市: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的模式匹配工具来解构列表。 然后只是在地图上调用此函数的情况:

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)
val x = Map[String, Seq[Int]]("MU" -> Seq(20,30,56,45),"MC" -> Seq(20,30,56,45,78))

x.map(a => a._1 -> a._2.last)

这不是更简单吗?

为什么不使用List.last? 我不认为自己制造轮子是个好主意。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM