Scala - 将Array [String]转换为Array [Double]

Sha*_*man 14 arrays functional-programming scala

我是函数式编程语言的新手,我正在Scala中学习大学项目.

这可能看起来很简单,但我无法在网上找到足够的帮助或直接这样做 - 如何将Array [String]转换为Array [Double]?我有一个CSV文件,当读入REPL时被解释为String值(文件的每一行都有整数和字符串值的混合),这将返回一个类型Array [String].我想用double/int值对字符串值进行编码,以返回Array [Double]以使数组均匀.有这么简单的方法吗?任何指导将不胜感激.

我到现在所做的是:

def retrieveExamplesFromFile(fileName : String) : Array[Array[String]] = {
  val items = for {
    line <- Source.fromFile(fileName).getLines()
    entries = line.split(",")
    } yield entries

  return items.toArray
}
Run Code Online (Sandbox Code Playgroud)

每行的格式(作为String []返回)是这样的:

[[1.0, 2.0, item1], [5, 8.9, item2],....]
Run Code Online (Sandbox Code Playgroud)

要将CSV文件中的每一行转换为双数组,我只能起草一个伪造的定义:

def generateNumbersForStringValues(values : Array[String]) : Array[Double] = {
val line = for(item <- values)
{
    //correct way?
    item.replace("item1", "1.0")
    item.replace("item2", "1.0")    
} 
return //unable to typecast/convert
}
Run Code Online (Sandbox Code Playgroud)

欢迎任何想法.感谢您的时间.

Ben*_*ich 25

您可能希望与以下map一起使用toDouble:

values.map(x => x.toDouble)
Run Code Online (Sandbox Code Playgroud)

或者更简洁:

values.map(_.toDouble)
Run Code Online (Sandbox Code Playgroud)

对于非双字符串的回退,您可以考虑使用Trymonad(in scala.util):

values.map(x => Try(x.toDouble).getOrElse(1.0))
Run Code Online (Sandbox Code Playgroud)

如果您知道每条线的外观,您还可以进行模式匹配:

values map { 
    case Array(a, b, c) => Array(a.toDouble, b.toDouble, 1.0)
}
Run Code Online (Sandbox Code Playgroud)