2016-05-14 15 views
0

文字列のかっこの数が有効かどうかを確認するための再帰的メソッドを実装しました。ここでは、コードScalaの特定の条件に基づいて値を計算する方法

def balance(chars: List[Char]): Boolean = { 
    @tailrec 
    def isValid(newChars: List[Char], difference: Int): Boolean = { 
     if (newChars.isEmpty) difference == 0 
     else if (difference < 0) false 
     else { 
     var newDifference = difference // Scala IDE gives warning here 

     if (newChars.head == '(') newDifference = difference + 1 
     else if (newChars.head == ')') newDifference = difference - 1 

     isValid(newChars.tail, newDifference) 
     } 
    } 

    isValid(chars, 0) 
} 

私は、次のテストケースのために上記のコードをテストし、それはだから私は唯一の場合/他のはしごを改善するために探しています正常に動作です。コードで述べたように

println("Testing parenthesis balancing") 
assert(balance("(Sachin is learning (scala) and (spark))".toList)) 
assert(!balance("(Invalid))(expression)".toList)) 
assert(balance("".toList)) 
assert(balance("()()".toList)) 
assert(!balance("{())}{()}".toList)) 

、ScalaのIDEは

を言ってその行に文句を言う、私は使用しなくてもnewDifferenceの値を計算する方法が本当にわからない変更可能なローカル変数

を避けてくださいif/else。私が見ることができる他のオプションは、newDifferenceの計算値を使ってif/elseラダーで直接isValidメソッドを呼び出すことです。

私はまだScalaを学んでいますので、ローカル変数(または他の警告)に変更を加えずにこのコードを書くことができる可能性があります。あなたが書くことができ

答えて

2

ifとして

val newDifference = 
    if (newChars.head == '(') difference + 1 
    else if (newChars.head == ')') difference - 1 
    else difference; 

をScalaでは表現され、またはmatchを使用し、この場合には、より慣用的とみなされるであろう:

val newDifference = newChars.head match { 
    case '(' => difference + 1 
    case ')' => difference - 1 
    case _ => difference 
} 

関数全体を変換することができます1つのmatchnewCharsと入力してください。お待ちしております。いくつかのアイディアについては、最初の例hereを参照してください。

+0

+1あなたの2番目の例では、マッチパターンが本当に素晴らしく、これが私が探していたものです。ありがとう@Dogbert – sachinjain024

3

人々はそれにパターンマッチを使用します。そうすれば、可変変数と "if/else ladder"の両方を避けることができ、ひどい "スパゲッティコード"になります。

def isValid(chars: List[Char], ps: Int = 0) = (chars, ps) match { 
     case (Nil, _) => ps == 0 
     case (_, _) if ps < 0 => false 
     case ('(' :: tail, ps) => isValid(tail, ps + 1) 
     case (')' :: tail, ps) => isValid(tail, ps - 1) 
     case (_ :: tail, ps) => isValid(tail, ps) 
    } 
+0

素晴らしい!私の最初のコードの修正。あなたの答えはマッチパターンがスパゲッティコードを作る方法の素晴らしい例です。その点を作ってくれてありがとう。 – sachinjain024

関連する問題