0
votes

Comment lancer une exception dans la correspondance de modèles Scala?

J'ai une chaîne "-3 + 4 - 1 + 1 + 12 - 5 + 6" et je veux trouver une solution à cette équation. Et protégez-le des caractères indésirables (comme abc ou #).

La solution de cette équation est correcte mais je ne peux pas gérer d'exception lorsque d'autres signes dans la chaîne se produisent. J'utilise Scala et la correspondance de motifs, c'est un nouveau sujet pour moi et je ne sais pas pourquoi cela ne fonctionne pas.

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

Sortie quand

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

devrait lancer une mauvaise exception d'opérateur mais j'ai:

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);


1 commentaires

Le problème est que vous essayez de convertir # en int qui provoque l'exception ce que vous pouvez faire est de vérifier isdigit et dans l'essentiel soulever une exception que vous voulez


3 Réponses :


3
votes

il vous suffit d'attribuer 0 à la température lorsque vous essayez de convertir - en chiffre, cela vous donne le NumberFormatException.

vous devez juste garder cela à l'esprit après chaque opérateur ("-", " + ") il devrait y avoir un espace.

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)
}


0 commentaires

1
votes

N'utilisez pas l'état mutable, c'est diabolique ...

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

  }


3 commentaires

OP a mentionné qu'il était nouveau dans la correspondance de modèles. J'aime votre solution, mais il peut être utile d'ajouter une explication sur la façon dont vous avez utilisé les inconvénients dans vos cas de correspondance.


@codenoodle, n'hésitez pas à modifier et à ajouter une explication là où vous le jugez nécessaire.


L'OP a spécifiquement dit "c'est un nouveau sujet" pour eux, et non seulement cela est vague et peu clair pour moi (et ce n'est pas un nouveau sujet pour moi), mais cela ne fonctionne même pas avec le code. Désolé, mais ce n'est qu'une mauvaise réponse et ne vaut pas la peine d'être modifié.



1
votes

Correction de la réponse de Dima:

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 commentaires