I have a Array of Strings
scala> tokens
res34: Array[String] = Array(The, value, of, your, profile, is, 234.2., You, have, potential, to, gain, 8.3, more.)
Here each of comma separated value is a String.
I want to extract numbers from this i.e. my output should be result = (234.2, 8.3) & it should be mutable so that I can read from another array and append values
What data structure should I use to achieve this?
Consider
import scala.util._
tokens.flatMap(s => Try( s.split("\\W+").mkString(".").toDouble ).toOption)
where we tokenize further each array string into words and append them by a dot (this ought to strip out for instance trailing dots); we convert the resulting tokens into doubles whenever possible (note Try
toOption
will deliver None
for failed conversions). With flatMap
we keep only successful conversion.
Simply filter your array with regex
val numericRegex: String = "\\d+\\.\\d+"
tokens filter(_.matches(numericRegex))
Note that the 6'th value 232.2. is not a number. you must remove the last dot "." so it will be 232.2
If values include spaces than you have to trim them
tokens map (_.trim) filter (_.matches(numericRegex))
res28: Array[String] = Array(234.2, 8.3)
With Regex, you can use this code to catch all the numbers:
\d+\.?\d+
In Scala there is a syntactic sugar to compose map
and filter
called for comprehension. Below is a version of regex approach based on for
:
val regex = ".*\\d+\\.?\\d+.*"
val nums = for {
str <- tokens if str.matches(regex)
numStr = str.trim.split("\\W+").mkString(".")
} yield numStr.toDouble
It gives the desired output:
nums: Array[Double] = Array(234.2, 8.3)
来源:https://stackoverflow.com/questions/40459723/extract-numbers-from-string-array