问题:Java程序从二次方程式中分解系数,例如
如果输入字符串是:
String str1;
str1 = "4x2-4x-42=0"
所以我需要从给定的输入字符串中拆分系数,并以
a = 4 b = -4 c = -42
我尝试了这个:
String equation = "ax2+bx-c=0";
String[] parts = equation.split("\\+|-|=");
for (int i = 0; i < parts.length - 2; i++) {
String part = parts[i].toLowerCase();
System.out.println(part.substring(0, part.indexOf("x")));
}
System.out.println(parts[2]);
但是我得到的输出为23x2和4x和4。
实际需要的输出是
23 ,- 4 , 4
。 最佳答案
使用正则表达式,以下模式将起作用:
([+-]?\d+)[Xx]2\s*([+-]?\d+)[Xx]\s*([+-]?\d+)\s*=\s*0
这将匹配二次方并提取参数,让我们弄清楚它是如何工作的:
(...)
这正在捕获组[+-]?\d+
与许多数字匹配,可以选择在前面加上+
或-
[Xx]
\s*
匹配零个或多个空格所以
([+-]?\d+)
与参数“a”匹配[Xx]2
匹配“X2”或“x2” \s*
与可选的空白([+-]?\d+)
与参数“b”匹配[Xx]
匹配“X”或“x” \s*
与可选的空白([+-]?\d+)
与“c”参数\s*=\s*0
将“= 0”与一些可选空格匹配让我们将其包装在
class
中:private static final class QuadraticEq {
private static final Pattern EQN = Pattern.compile("([+-]?\\d+)[Xx]2\\s*([+-]?\\d+)[Xx]\\s*([+-]?\\d+)\\s*=\\s*0");
private final int a;
private final int b;
private final int c;
private QuadraticEq(int a, int b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
public static QuadraticEq parseString(final String eq) {
final Matcher matcher = EQN.matcher(eq);
if (!matcher.matches()) {
throw new IllegalArgumentException("Not a valid pattern " + eq);
}
final int a = Integer.parseInt(matcher.group(1));
final int b = Integer.parseInt(matcher.group(2));
final int c = Integer.parseInt(matcher.group(3));
return new QuadraticEq(a, b, c);
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("QuadraticEq{");
sb.append("a=").append(a);
sb.append(", b=").append(b);
sb.append(", c=").append(c);
sb.append('}');
return sb.toString();
}
}
请注意
\\
,这是Java必需的。快速测试:
System.out.println(QuadraticEq.parseString("4x2-4x-42=0"));
输出:
QuadraticEq{a=4, b=-4, c=-42}