从二次方程中提取系数的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++) {

问题: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]);
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+
    这与许多数字匹配,前面可选地有一个
    +
    -
  • [Xx]
    这与“X”或“X”匹配
  • \s*
    这匹配零个或多个空格
所以

  • ([+-]?\d+)
    与“a”参数匹配
  • [Xx]2
    匹配“X2”或“X2”
  • \s*
    匹配可选空白
  • ([+-]?\d+)
    与“b”参数匹配
  • [Xx]
    匹配“X”或“X”
  • \s*
    匹配可选空白
  • ([+-]?\d+)
    与“c”参数匹配
  • \s*=\s*0
    将“=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;i
for(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