我是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
。
答案 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
中对其进行测试