Scala - добавление элементов на основе логики - PullRequest
2 голосов
/ 30 мая 2019

Я новичок в Скале.У меня есть функция, которая принимает строку и основана на различных логиках, мне нужно создать Seq of String со всеми перестановками.Пример - входная строка 00US_India0234.Результат будет Seq из:

US // Condition - if string contains "US"
India // Condition - if string contains "India"
234 // Condition - if string contains number and trim
US_India // One more condition to keep countries intact and so on

Код, который я пробовал до сих пор, но я не работал

val retSeq: Seq[String] = Seq.empty
if myStr contains "US" retSeq +: "US"

У меня есть условия, но добавить в Seq невозможнои я не хочу создавать var.

Ответы [ 2 ]

3 голосов
/ 30 мая 2019

Вы можете создать список кортежей, содержащих предикаты и функции для обработки ввода, который вы хотите применить и добавить к Seq:

val numberRegex = "([0-9]{4,})".r

val predicates = List[(String => Boolean, String => String)](
    (s => s.contains("US"), _  => "US"),
    (s => s.contains("India"), s => s.toUpperCase()),
    (s => numberRegex.findFirstIn(s).nonEmpty, s => numberRegex.findFirstIn(s).head)
 )

А затем вам нужно просто создать метод для сборки Seq:

def process(s: String): Seq[String] = predicates.collect{
   case (predicate, value) if predicate(s) => value(s)
}

process("00US_India0234") //List(US, 00US_INDIA0234, 0234)
2 голосов
/ 30 мая 2019

Вот другая версия, использующая RegEx:

import scala.util.matching.Regex

val input = "00US_India0234"

val reg = "([A-Z]{2})_?([A-Za-z]+)([0-9]+)".r

val a = for (m <- reg.findAllMatchIn(input)) yield m.subgroups

println(a.toVector.flatten)

// Out: Vector(US, India, 0234)

Вы можете проверить это в scalafiddle

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...