在Scala中将文本文件分离为映射

时间:2016-12-11 18:50:04

标签: scala

我是Scala的新手,我正在创建一个应用程序,我必须映射一个代表名称的字符串,其中包含由整数列表表示的测试分数。

基本上我有以下信息:

Neil, 68, 79, 90
Buzz, 81, 52, 65
Michael, 95, 92, 81

在名为scores.txt的文本文件中,即

val mapData = readTextFile("scores.txt")

我希望在每个人得分后将其拆分并将其映射到字符串和整数列表。我目前有一个名为readTextFile的函数,它将txt文件作为输入,从那里我有点难过。

我知道它应该与以下内容类似但我无法理解它。

def readTextFile(filename: String): Map[String, List[Int]] = {
  var mapBuffer: Map[String, List[Int]] = Map()
  try {
    for (line <- Source.fromFile(filename).getLines()) {
      val splitline = line.split(",").map(_.trim).toList

      // add element to map buffer
      mapBuffer = mapBuffer ++ Map(splitline.head -> splitline.tail.head.toInt)
    }
  } catch {
    case ex: Exception => println("Sorry, an exception happened.")
  }
  mapBuffer
}

非常感谢任何帮助。

先谢谢,史蒂文。

2 个答案:

答案 0 :(得分:1)

您需要修复此行。 splitline.tail.head.toInt只获取每行中的第二个元素。您想要将splitline的尾部映射并转换为List[Int]

mapBuffer = mapBuffer ++ Map(splitline.head -> splitline.tail.map(_.toInt))

答案 1 :(得分:1)

我建议使用对线条的理解来制作对,然后将它们转换为地图:

def readTextFile(filename: String) = {
  val pairs = 
    for {
      line <- Source.fromFile(filename).getLines()
      split = line.split(",").map(_.trim).toList
      name = split.head
      scores = split.tail.map(_.toInt)
    } yield (name -> scores)
  pairs.toMap
}