将字符串的scala列表转换为双打列表,同时丢弃不可转换的字符串

时间:2015-11-21 21:25:16

标签: scala

我试图将字符串列表解析为数字格式,而忽略了无法解析的任何内容。这是我的尝试,但我无法帮助,但认为这是一个足够普遍的模式,必须有一个比调用2个地图和过滤器更好的方法。有人可以建议一种更规范的方法吗?也许使用某种部分功能?谢谢!

git svn clone -s <svn_url>
cd repo_name
#work#work#work
git svn rebase
git svn dcommit

输出:

if ("Bob".equals(data[i][j]))

4 个答案:

答案 0 :(得分:9)

flatMap有帮助:

scala>  List("1","2","foo","4").flatMap(s => scala.util.Try(s.toDouble).toOption)
res0: List[Double] = List(1.0, 2.0, 4.0)

答案 1 :(得分:5)

请记住,异常会让您失望很多。因此,尽管Try方法有效,但如果大多数事情都不是数字,那么它将无法很快发挥作用。

你可以写一个正则表达式来挑选可能是双打的东西:

val D = """(-?[0-9]+(?:\.[0-9]+)(?:[eE]?[+-]?[0-9]+)?)""".r

然后你只会尝试解析实际上是双打的东西:

val xs = List("1", "2", "foo", "4")
xs.collect{
  case D(x) => x.toDouble
  case "NaN" => Double.NaN
  case "Infinity" => Double.PositiveInfinity
  case "-Infinity" => Double.NegativeInfinity
}

根据应用程序,当有大量非Double条目时(例如,在您的示例中为1/4),它大约快10-60倍。

答案 2 :(得分:3)

使用collect和模式匹配:

scala> List("1", "2", "foo", "4")
         .map(s => Try(s.toDouble))
         .collect { case Success(x) => x }

res3: List[Double] = List(1.0, 2.0, 4.0)

答案 3 :(得分:0)

使用for comprehension可以获得所需的结果,例如

for { 
  x <- xs
  v <- Try(x.toDouble).toOption
} yield v

请注意,评估为v的{​​{1}}不会产生。{/ p>