我需要保证一个字符串只包含允许的符号。现在我这样做:
def isCorrect(s: String, allowedChars: String): Boolean = {
s.distinct.foreach(c => {
if (!allowedChars.contains(c))
return false
})
true
}
不用说,这看起来不太漂亮。有没有更好、更实用的方法来做到这一点?
作为记录,您可以通过不将自己限制为字符串来使其更通用,并且通过切换参数的顺序和使用两个参数列表来使其更实用(在我看来)。我是这样写的:
def isCorrect[A](allowed: Set[A])(s: Seq[A]) = s forall allowed
现在您可以将此方法视为一个函数并“部分应用”它以创建更专业的函数:
val isDigits = isCorrect("0123456789".toSet) _
val isAs = isCorrect(Set('A')) _
它允许您执行以下操作:
scala> isDigits("218903")
res1: Boolean = true
scala> isAs("218903")
res2: Boolean = false
scala> isDigits("AAAAAAA")
res3: Boolean = false
scala> isAs("AAAAAAA")
res4: Boolean = true
或者你仍然可以使用类似isCorrect("abcdr".toSet)("abracadabra")
.
def isCorrect(s:String, allowedChars:String):Boolean = {
s.forall{allowedChars.contains(_)}
}
或者,更简洁地说,遵循@ziggystar 的建议:
def isCorrect(s: String, allowedChars: Seq[Char]) = s forall allowedChars.contains
这不是更实用,而是使用正则表达式:
def isCorrect(s: String, allowedChars: String): Boolean =
s.matches ("^["+ allowedChars +"]*$")
由于正则表达式经常被优化,我会在性能关键代码中考虑这种方法——如果没有测试、测量,也许还有预编译的模式——如果适合手头的问题的话。
由于更具功能性,我看到了 Travis 代码。
我不知道这是否是最实用的方法,但你可以这样做:
def isCorrect(s: String, allowedChars: String): Boolean = {
return s.distinct.forall(c => allowedChars.contains(c))
}
不同的并不是真正必要的。