2016-11-07 1 views
0

У меня есть массив строкИзвлечение номера из массива строк

scala> tokens 
res34: Array[String] = Array(The, value, of, your, profile, is, 234.2., You, have, potential, to, gain, 8.3, more.) 

Здесь каждый из разделенных запятыми значение является строкой.
Я хочу, чтобы извлечь номера из этого, то есть мой вывод должен быть результата = (234,2, 8,3) & он должен быть изменяемым, так что я могу читать из другого массива и добавить значения

Какую структуру данных следует использовать для достижения этой цели?

ответ

4

Рассмотрим

import scala.util._ 
tokens.flatMap(s => Try(s.split("\\W+").mkString(".").toDouble).toOption) 

где мы токенизировать дополнительно каждая строка массива в слов и добавить их точкой (это должно вырезать, например, конечные точки); мы по возможности конвертируем полученные токены в парные места (примечание TrytoOption доставит None за неудачные конверсии). С flatMap мы сохраняем только успешное преобразование.

+0

Я новичок в Scala. Что такое _xs_ здесь? & мы разделяем отдельные токены из массива или всего предложения? –

+0

Используется теперь 'tokens' вместо' xs' :) Мы разбиваем каждый токен в массиве, пытаясь извлечь только «слова» (буквенно-цифровые последовательности), которые склеены с точками (mkString («.»)), А затем мы попробуйте преобразовать их в парные. – elm

+0

Это сработало! Спасибо :) –

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) 
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) 

 Смежные вопросы

  • Нет связанных вопросов^_^