从二次方程中提取系数的Java程序
问题:Java程序将系数从二次方程中分离出来,例如 如果输入字符串为:从二次方程中提取系数的Java程序,java,regex,string,math,Java,Regex,String,Math,问题: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 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]);
String等式=“ax2+bx-c=0”;
字符串[]部分=等式。拆分(“\\+\124;-\=”;
对于(int i=0;i
但我得到的输出是23x2,4x和4。
如果仅使用二次函数,则实际需要的输出为
23,-4,4
:
int xsqrd = equation.indexOf("x2");
int x = equation.indexOf("x", xsqrd);
int equ = equation.indexOf("=");
String a = equation.subString(0,xsqrd);
String b = equation.subString(xsqrd+1,x);
String c = equation.subString(x,equ);
我可能弄乱了子字符串,但你知道了大概的意思。你可以使用正则表达式,如下所示:
final String regex = "([+-]?\\d+)x2([+-]\\d+)x([+-]\\d+)=0";
Pattern pattern = Pattern.compile(regex);
final String equation = "4x2-4x-42=0";
Matcher matcher = pattern.matcher(equation);
if (matcher.matches()) {
int a = Integer.parseInt(matcher.group(1));
int b = Integer.parseInt(matcher.group(2));
int c = Integer.parseInt(matcher.group(3));
System.out.println("a=" + a + " b=" + b + " c=" + c);
}
输出:
a=4 b=-4 c=-42
QuadraticEq{a=4, b=-4, c=-42}
使用Regex,以下模式将起作用:
([+-]?\d+)[Xx]2\s*([+-]?\d+)[Xx]\s*([+-]?\d+)\s*=\s*0
这将匹配二次曲线并提取参数,让我们了解其工作原理:
这是捕获组(…)
这与许多数字匹配,前面可选地有一个[+-]?\d+
或+
-
这与“X”或“X”匹配[Xx]
这匹配零个或多个空格\s*
与“a”参数匹配([+-]?\d+)
匹配“X2”或“X2”[Xx]2
匹配可选空白\s*
与“b”参数匹配([+-]?\d+)
匹配“X”或“X”[Xx]
匹配可选空白\s*
与“c”参数匹配([+-]?\d+)
将“=0”与一些可选空格匹配\s*=\s*0
类中
:
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"));
输出:
a=4 b=-4 c=-42
QuadraticEq{a=4, b=-4, c=-42}
第一个注意事项:如果在regexp中使用符号作为分隔符,则在slpitted元素中会丢失它。我建议您使用以下regexp:
"x2|x|="
然后,你只能得到数字。
完整的代码片段是:
public class Main {
private static final char[] varNames = {'a', 'b', 'c'};
public static void main(String[] args) {
String equation = "4x2-4x-42=0";
String[] parts = equation.split("x2|x|=");
// you will get 4 elements, but the last element is always 0
for(int i=0; i<parts.length - 1; i++){
System.out.println(varNames[i] + " = " + Integer.parseInt(parts[i]));
}
}
}
公共类主{
私有静态final char[]varNames={'a','b','c'};
公共静态void main(字符串[]args){
字符串方程=“4x2-4x-42=0”;
字符串[]部分=方程.split(“x2 | x |=”;
//您将获得4个元素,但最后一个元素始终为0
for(int i=0;ifor(int i=0;i
因此输入的格式始终是+/-aX2+/-bX+/-c
?听起来像是…regex的工作。是的。始终是这种格式您只需要系数吗?如果您打算稍后也获得指数,我建议为您的表达式构建一个小型解析器。我只需要系数。如果输入字符串是“4x2-4x-42=0”和“a=4B=-4C=-42”这应该是输出如果输入字符串是“4x2-4x-42=0”和“a=4B=-4C=-42”这应该是输出错误:类型匹配器中的方法组(int)不适用于参数(字符串)final int a=Integer.parseInt(Matcher.group(“a”);final int b=Integer.parseInt(matcher.group(“b”);final int c=Integer.parseInt(matcher.group(“c”));@JoeMathew你是在告诉我你正在使用Java 6吗?它已经超过十年了,两年前达到EOL。为什么?先生,我在我的新安卓应用程序中使用它,有没有办法修改it@JoeMathew您的问题没有标记。为什么?不要使用命名组,并按索引获取组。我得到的答案为0