Scala-根据逻辑添加元素

时间:2019-05-30 14:12:22

标签: scala functional-programming

我是Scala的新手。 我有一个接受字符串的函数,并且基于不同的逻辑,我需要创建一个具有所有排列的字符串序列。 示例-输入字符串为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 个答案:

答案 0 :(得分:3)

您可以创建一个包含谓词和函数的元组列表,以处理您可能要应用的输入并追加到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)

答案 1 :(得分:2)

这是另一个版本,使用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

中对其进行测试