4

文字列に許可された記号のみが含まれることを保証する必要があります。今、私はそれをこのようにします:

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

  true
}

言うまでもなく、これはあまりきれいに見えません。これを行うためのより良い、より機能的な方法はありますか?

4

4 に答える 4

19

記録のために、文字列に制限しないことでこれをもう少し一般的にすることができ、引数の順序を切り替えて2つの引数リストを使用することで(私の見解では)もう少し機能的にすることができます。これが私がそれを書く方法です:

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 = {
    return s.distinct.forall(c => allowedChars.contains(c))
}

明確なものは本当に必要ではありません。

于 2012-04-19T22:59:51.643 に答える
2

これはより機能的ではありませんが、正規表現を使用します。

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

正規表現は最適化されることが多いため、目前の問題に適切な場合は、テスト、測定、および場合によってはプリコンパイルされたパターンを使用せずに、パフォーマンスが重要なコードでこのアプローチを検討します。

より機能的なフレーバーとして、Travisコードが表示されます。

于 2012-04-20T09:25:36.657 に答える