我有一个字符串数组
scala> tokens
res34: Array[String] = Array(The, value, of, your, profile, is, 234.2., You, have, potential, to, gain, 8.3, more.)
这里每个逗号分隔值都是一个字符串 我想从中提取数字,即我的输出应该是 result =(234.2,8.3)&它应该是可变的,以便我可以从另一个数组中读取并附加值
我应该使用什么数据结构来实现这一目标?
答案 0 :(得分:4)
考虑
value
我们将每个数组字符串进一步标记为 words 并用点附加它们(这应该去除例如尾随点);我们会尽可能将生成的令牌转换为双打(注意import scala.util._
tokens.flatMap(s => Try( s.split("\\W+").mkString(".").toDouble ).toOption)
Try
会为失败的转化提供toOption
。使用None
,我们只会成功转换。
答案 1 :(得分:2)
只需使用正则表达式过滤数组
val numericRegex: String = "\\d+\\.\\d+"
tokens filter(_.matches(numericRegex))
请注意,第6个值 232.2。 不是数字。你必须删除最后一个点“。”所以它将是 232.2
如果值包含空格而不是必须修剪它们
tokens map (_.trim) filter (_.matches(numericRegex))
res28: Array[String] = Array(234.2, 8.3)
答案 2 :(得分:1)
答案 3 :(得分:1)
在Scala中,有一个句法糖来组成map
和filter
,称为for comprehension。以下是基于for
:
val regex = ".*\\d+\\.?\\d+.*"
val nums = for {
str <- tokens if str.matches(regex)
numStr = str.trim.split("\\W+").mkString(".")
} yield numStr.toDouble
它提供了所需的输出:
nums: Array[Double] = Array(234.2, 8.3)