Scala-基于逻辑添加元素
我是斯卡拉的新手。 我有一个接受字符串的函数,基于不同的逻辑,我需要创建一个包含所有排列的字符串序列。 示例-输入字符串为Scala-基于逻辑添加元素,scala,functional-programming,Scala,Functional Programming,我是斯卡拉的新手。 我有一个接受字符串的函数,基于不同的逻辑,我需要创建一个包含所有排列的字符串序列。 示例-输入字符串为00US\u India0234。结果将是以下各项的Seq: US // Condition - if string contains "US" India // Condition - if string contains "India" 234 // Condition - if string contains number and trim US_India // On
00US\u 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
您可以创建一个元组列表,其中包含谓词和函数,以处理您可能要应用并附加到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)
)
def process(s: String): Seq[String] = predicates.collect{
case (predicate, value) if predicate(s) => value(s)
}
process("00US_India0234") //List(US, 00US_INDIA0234, 0234)
然后您只需要创建一个方法来构建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)
)
def process(s: String): Seq[String] = predicates.collect{
case (predicate, value) if predicate(s) => value(s)
}
process("00US_India0234") //List(US, 00US_INDIA0234, 0234)
下面是另一个版本,使用
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)
import scala.util.matching.Regex
val input=“00US\U India0234”
val reg=“([A-Z]{2})?([A-Za-Z]+)([0-9]+)”
val a=for(m)你能发布一些你尝试过的代码吗?我是新来的,不知道从哪里开始。我不想创建多个Seq你想要这个吗?输入:00US\u India0234
->输出:Seq(美国,印度,0234,美国印度)
?是的。这将基于一些条件,并且在不使用mutable的情况下,如果我想调用一个函数而不是const string,该条件会是什么样子?我尝试过(s=>s.contains(“US”),trim(s)),但它不起作用。您可能需要更改列表的类型。您能用示例编辑您的问题吗?这样会容易得多。(s=>s.matches(“.*\\d+.”,“0234”)应该返回数字,而不是硬编码的字符串。我不寻找正则表达式,因为我可能有多个可能无法实现的条件。但感谢您提供另一个选项