Scala - 将 Array[String] 转换为 Array[Double]
Scala - convert Array[String] to Array[Double]
我是函数式编程语言的新手,我正在为一个大学项目在 Scala 中学习它。
这可能看起来很简单,但我无法在网上找到足够的帮助或直接的方法 - 如何将 Array[String] 转换为 Array[Double]?我有一个 CSV 文件,当读入 REPL 时,它被解释为字符串值(文件的每一行都有整数和字符串值的混合),这将 return 类型 Array[String]。我想用 double/int 值将字符串值编码为 return 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
}
每一行的格式(returned as String[])是这样的:
[[1.0, 2.0, item1], [5, 8.9, item2],....]
为了将 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
}
欢迎任何想法。谢谢你的时间。
您的意思是将所有字符串都转换为 double,并为所有不可转换的字符串回退到 1.0?那将是:
val x = Array(
Array("1.0", "2.0", "item1"),
Array("5", "8.9", "item2"))
x.map( _.map { y =>
try {
y.toDouble
} catch {
case _: NumberFormatException => 1.0
}
})
您可能想将 map
与 toDouble
一起使用:
values.map(x => x.toDouble)
或者更简洁:
values.map(_.toDouble)
对于非双精度字符串的回退,您可以考虑使用 Try
monad(在 scala.util
中):
values.map(x => Try(x.toDouble).getOrElse(1.0))
如果你知道每一行的样子,你也可以进行模式匹配:
values map {
case Array(a, b, c) => Array(a.toDouble, b.toDouble, 1.0)
}
扩展@DaunnC 的评论,您可以使用 Try
实用程序执行此操作并对结果进行模式匹配,这样您就可以避免调用 get
或将结果包装在 Option
:
import scala.util.{Try, Success, Failure}
def main = {
val maybeDoubles = Array("5", "1.0", "8.5", "10.0", "item1", "item2")
val convertDoubles = maybeDoubles.map { x =>
Try(x.toDouble)
}
val convertedArray = convertDoubles.map {
_ match {
case Success(res) => res
case Failure(f) => 1.0
}
}
convertedArray
}
这允许您对 Try
的结果进行模式匹配,它始终是 Success
或 Failure
,而无需调用 get
或换行你的结果。
以下是有关 Try 的更多信息,由 Mauricio Linhares 提供:https://mauricio.github.io/2014/02/17/scala-either-try-and-the-m-word.html
Scala 2.13
引入了 String::toDoubleOption
,它在 map
转换中使用,可以与 Option::getOrElse
关联以安全地将 String
转换为 Double
s:
Array("5", "1.0", ".", "8.5", "int").map(_.toDoubleOption.getOrElse(1d))
// Array[Double] = Array(5.0, 1.0, 1.0, 8.5, 1.0)
我是函数式编程语言的新手,我正在为一个大学项目在 Scala 中学习它。
这可能看起来很简单,但我无法在网上找到足够的帮助或直接的方法 - 如何将 Array[String] 转换为 Array[Double]?我有一个 CSV 文件,当读入 REPL 时,它被解释为字符串值(文件的每一行都有整数和字符串值的混合),这将 return 类型 Array[String]。我想用 double/int 值将字符串值编码为 return 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
}
每一行的格式(returned as String[])是这样的:
[[1.0, 2.0, item1], [5, 8.9, item2],....]
为了将 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
}
欢迎任何想法。谢谢你的时间。
您的意思是将所有字符串都转换为 double,并为所有不可转换的字符串回退到 1.0?那将是:
val x = Array(
Array("1.0", "2.0", "item1"),
Array("5", "8.9", "item2"))
x.map( _.map { y =>
try {
y.toDouble
} catch {
case _: NumberFormatException => 1.0
}
})
您可能想将 map
与 toDouble
一起使用:
values.map(x => x.toDouble)
或者更简洁:
values.map(_.toDouble)
对于非双精度字符串的回退,您可以考虑使用 Try
monad(在 scala.util
中):
values.map(x => Try(x.toDouble).getOrElse(1.0))
如果你知道每一行的样子,你也可以进行模式匹配:
values map {
case Array(a, b, c) => Array(a.toDouble, b.toDouble, 1.0)
}
扩展@DaunnC 的评论,您可以使用 Try
实用程序执行此操作并对结果进行模式匹配,这样您就可以避免调用 get
或将结果包装在 Option
:
import scala.util.{Try, Success, Failure}
def main = {
val maybeDoubles = Array("5", "1.0", "8.5", "10.0", "item1", "item2")
val convertDoubles = maybeDoubles.map { x =>
Try(x.toDouble)
}
val convertedArray = convertDoubles.map {
_ match {
case Success(res) => res
case Failure(f) => 1.0
}
}
convertedArray
}
这允许您对 Try
的结果进行模式匹配,它始终是 Success
或 Failure
,而无需调用 get
或换行你的结果。
以下是有关 Try 的更多信息,由 Mauricio Linhares 提供:https://mauricio.github.io/2014/02/17/scala-either-try-and-the-m-word.html
Scala 2.13
引入了 String::toDoubleOption
,它在 map
转换中使用,可以与 Option::getOrElse
关联以安全地将 String
转换为 Double
s:
Array("5", "1.0", ".", "8.5", "int").map(_.toDoubleOption.getOrElse(1d))
// Array[Double] = Array(5.0, 1.0, 1.0, 8.5, 1.0)