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

时间:2016-12-23 05:46:17

标签: scala list recursion

我是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):_*)
  }

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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)

这不是更简单吗?

答案 2 :(得分:0)

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