Как создать исключение при сопоставлении с шаблоном Scala? - PullRequest
0 голосов
/ 06 января 2019

У меня есть строка "-3 + 4 - 1 + 1 + 12 - 5 + 6", и я хочу найти решение этого уравнения. И защитите его от нежелательных символов (например, abc или #).

Решение этого уравнения верное, но я не могу обработать исключение, когда встречаются другие знаки в строке. Я использую Scala и сопоставление с образцом, это новая тема для меня, и я не уверен, почему это не работает.

object Main extends App {

  val numberString = "-3 + 4 - 1 + 1 + 12 - 5  + 6";

  val abc:  List[String] = numberString.split("\\s+").toList

  var temp = abc.head.toInt


  for (i <- 0 until abc.length) {
    abc(i) match {
      case "+" => temp += abc(i+1).toInt
      case "-" => temp -= abc(i+1).toInt
      case x if -100 to 100 contains x.toInt=> println("im a number ")

      case _ => throw new Exception("wrong opperator")

     }

}

println(temp);

Вывод при

numberString = "-3 + 4 # - 1 + 1 + 12 - abc 5 + 6";

должен выдавать неправильный оператор Exception, но у меня есть:

Exception in thread "main" im a number 
im a number 
java.lang.NumberFormatException: For input string: "#"

Ответы [ 3 ]

0 голосов
/ 06 января 2019

Не используйте изменяемое состояние, это зло ...

   val num = """(\d+)""".r // Regex to parse numbers
   @tailrec
   def compute(in: List[String], result: Int = 0): Int = in match {
      case Nil => result
      case "+" :: num(x) :: tail => compute(tail, result + num.toInt)
      case "-" :: num(x) :: tail => compute(tail, result - num.toInt)
      case ("+"|"-") :: x :: _ => throw new Exception(s"Bad number $x")
      case x :: Nil => throw new Exception(s"Invalid syntax: operator expected, but $x found.")
      case op :: _  => throw new Exception(s"Invalid operator $op")

  }
0 голосов
/ 07 января 2019

Исправляя ответ Димы:

val num = """(\d+)""".r // Regex to parse numbers
def compute(in: List[String], result: Int = 0): Int = in match {
  case Nil => result
  case "+" :: num(x) :: tail => compute(tail, result + x.toInt)
  case "-" :: num(x) :: tail => compute(tail, result - x.toInt)
  case ("+" | "-") :: x :: _ => throw new Exception(s"Bad number $x")
  case x :: Nil => throw new Exception(s"Invalid syntax: operator expected, but $x found.")
  case op :: _  => throw new Exception(s"Invalid operator $op")
}
0 голосов
/ 06 января 2019

вам просто нужно присвоить 0 температуре, когда вы пытаетесь конвертировать - в цифру это дает вам NumberFormatException.

Вы просто должны помнить об этом после каждого оператора ("-", "+") должен быть пробел.

object Solution extends App {
  val numberString = "- 3 + 4 - 1 + 1 + 12 - 5  + 6"

  val abc: List[String] = numberString.split("\\s+").toList

  var temp = 0


  for (i <- abc.indices) {
    abc(i) match {
      case "+" => temp += abc(i + 1).toInt
      case "-" => temp -= abc(i + 1).toInt
      case x if x.forall(_.isDigit) => println("im a number ")

      case _ => throw new Exception("wrong opperator")
    }
  }

  print(temp)
}
...