Извлечь коэффициенты из биномиального выражения, введенного в виде строки в Scala

Я пытаюсь написать программу, которая может найти корни квадратного уравнения, используя Scala. Входные данные должны представлять собой квадратное уравнение в форме ax^2+bx+c (например, 5x^2+2x+3) в виде строки.

Мне удалось закодировать вычисление корней, но у меня возникли проблемы с извлечением коэффициентов из ввода. Вот код, который я написал для извлечения коэффициентов:

def getCoef(poly: String) = {
  var aT: String = ""
  var bT: String = ""
  var cT: String = ""
  var x: Int = 2
  for (i <- poly.length - 1 to 0) {
    val t: String = poly(i).toString
    if (x == 2) {
      if (t forall Character.isDigit) aT = aT + t(i)
      else if (t == "^") {i = i + 1; x = 1}
    }
    else if (x == 1) {
      if (t forall Character.isDigit) bT = bT + t(i)
      else if (t == "+" || t == "-") x = 0
    }
    else if (x == 0) {
      if (t forall Character.isDigit) cT = cT + t(i)
    }
  val a: Int = aT.toInt
  val b: Int = bT.toInt
  val c: Int = cT.toInt
  (a, b, c)
  }
}

person Pulina Udapamunuwa    schedule 16.03.2017    source источник
comment
Вы думали об использовании регулярных выражений? Не уверен, насколько сложными могут быть ваши входные строки, но ваша проблема заключается в разборе, и для нее есть отличные решения, такие как регулярное выражение или, возможно, комбинаторы парсеров Scala.   -  person stholzm    schedule 16.03.2017
comment
str.split('x').map(v =› v.replace(^2,)).map(_.toDouble)   -  person FatTail    schedule 16.03.2017
comment
если вы не так увлечены регулярным выражением, и ваш ввод такой, как вы описываете.   -  person FatTail    schedule 16.03.2017


Ответы (1)


Простое решение с регулярным выражением:

def getCoef(poly: String) = {
  val polyPattern = """(\d+)x\^2\+(\d+)x\+(\d+)""".r
  val matcher = polyPattern.findFirstMatchIn(poly).get
  (matcher.group(1).toInt, matcher.group(2).toInt, matcher.group(3).toInt)
}

Не обрабатывает все случаи (например, минус) и просто выдает ошибку, если ввод не соответствует шаблону, но это должно помочь вам.

person stholzm    schedule 16.03.2017