4

我需要保证一个字符串只包含允许的符号。现在我这样做:

def isCorrect(s: String, allowedChars: String): Boolean = {
  s.distinct.foreach(c => {
    if (!allowedChars.contains(c))
      return false
  })

  true
}

不用说,这看起来不太漂亮。有没有更好、更实用的方法来做到这一点?

4

4 回答 4

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").

于 2012-04-19T23:41:27.250 回答
4
def isCorrect(s:String, allowedChars:String):Boolean = { 
        s.forall{allowedChars.contains(_)}
    }

或者,更简洁地说,遵循@ziggystar 的建议:

def isCorrect(s: String, allowedChars: Seq[Char]) = s forall allowedChars.contains
于 2012-04-19T22:57:08.560 回答
2

这不是更实用,而是使用正则表达式:

def isCorrect(s: String, allowedChars: String): Boolean =
  s.matches ("^["+ allowedChars +"]*$")

由于正则表达式经常被优化,我会在性能关键代码中考虑这种方法——如果没有测试、测量,也许还有预编译的模式——如果适合手头的问题的话。

由于更具功能性,我看到了 Travis 代码。

于 2012-04-20T09:25:36.657 回答
2

我不知道这是否是最实用的方法,但你可以这样做:

def isCorrect(s: String, allowedChars: String): Boolean = {
    return s.distinct.forall(c => allowedChars.contains(c))
}

不同的并不是真正必要的。

于 2012-04-19T22:59:51.643 回答