嗨,所以我试图基于文本文件创建Map [String,String],在文本文件中有以“ ;;;”开头的任意行。我忽略的功能,我不忽略的行是key->值。它们用2个空格隔开。
每当我运行代码时,我都会收到一条错误消息,说明期望的类型Map [String,String]不是必需的类型,即使我的转换似乎正确。
def createMap(filename: String): Map[String,String] = {
for (line <- Source.fromFile(filename).getLines) {
if (line.nonEmpty && !line.startsWith(";;;")) {
val string: String = line.toString
val splits: Array[String] = string.split(" ")
splits.map(arr => arr(0) -> arr(1)).toMap
}
}
}
我希望它返回一个(String-> String)映射,但是相反,我遇到了一堆错误。我该如何解决?
答案 0 :(得分:1)
由于您的if语句不是for循环中的表达式。产生结果时,应将if用作过滤器。要返回结果,您必须使其具有理解力。理解后过滤结果。您可以将此结构映射到Map。
import scala.io.Source
def createMap(filename: String): Map[String,String] = {
val keyValuePairs = for (line <- Source.fromFile(filename).getLines; if line.nonEmpty && !line.startsWith(";;;")) yield {
val string = line.toString
val splits: Array[String] = string.split(" ")
splits(0) -> splits(1)
}
keyValuePairs.toMap
}
好的,所以我再看了一下。该文件似乎具有一些损坏的编码。您可以尝试此作为解决方案。它在我的Scala REPL中有效:
import java.nio.charset.CodingErrorAction
import scala.io.{Codec, Source}
def createMap(filename: String): Map[String,String] = {
val decoder = Codec.UTF8.decoder.onMalformedInput(CodingErrorAction.IGNORE)
Source.fromFile(filename)(decoder).getLines()
.filter(line => line.nonEmpty && !line.startsWith(";;;"))
.flatMap(line => {
val arr = line.split("\\s+")
arr match {
case Array(key, value) => Some(key -> value)
case Array(key, values@_*) => Some(key -> values.mkString(" "))
case _ => None
}
}).toMap
}