我需要保证字符串只包含允许的符号。现在我这样做:
def isCorrect(s: String, allowedChars: String): Boolean = {
s.distinct.foreach(c => {
if (!allowedChars.contains(c))
return false
})
true
}
毋庸置疑,这看起来并不太漂亮。是否有更好,更实用的方法来做到这一点?
答案 0 :(得分:19)
对于记录,你可以通过不限制自己的字符串来使这更加通用,并且通过切换参数的顺序和使用两个参数列表来更加功能(在我看来)。这是我写的方式:
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")
的内容。
答案 1 :(得分:4)
def isCorrect(s:String, allowedChars:String):Boolean = {
s.forall{allowedChars.contains(_)}
}
或者,甚至更简洁地遵循@ ziggystar的建议:
def isCorrect(s: String, allowedChars: Seq[Char]) = s forall allowedChars.contains
答案 2 :(得分:2)
我不知道这是否是最实用的方法,但你可以这样做:
def isCorrect(s: String, allowedChars: String): Boolean = {
return s.distinct.forall(c => allowedChars.contains(c))
}
不同并非真的有必要。
答案 3 :(得分:2)
这不是更多功能,但使用正则表达式:
def isCorrect(s: String, allowedChars: String): Boolean =
s.matches ("^["+ allowedChars +"]*$")
由于正则表达式经常被优化,我会在性能关键代码中考虑这种方法 - 不是没有测试,测量,也可能是预编译模式 - 如果适合于手头的问题。
由于功能更多,我看到Travis代码。