多项式字符串不拆分

时间:2014-11-12 09:06:52

标签: java string polynomials

我有2个字符串。

String s1 = "x^5 + 22.6x^4 - x^3 - 41.3x^1 + 4.2";
String s2 = "-x^3  -  3x^2 + 2x + 22";

我想拆分字符串。我应该找到系数和指数。 我使用了这样的替换方法:s1.replaceAll("//s+","");所以我删除了所有空格。 当我使用split方法时。

String array[] = s2.split("//+");

我的输出是:

-x^3-3x^2
+2x
+22

但这不是答案。使用一种拆分方法,我将划分所有部分。

但我想在特殊代码" +"时拆分字符串。和" - "一起。但我没有再这样做了。 如果不删除空格,我可以拆分我的字符串吗?

2 个答案:

答案 0 :(得分:0)

一种方法是遍历不包含空格的polinome的所有子字符串(基本上所有变量和运算符本身。然后你可以决定在当前迭代中是否看到运算符或其他内容并单独处理它们。如果你不要看一个操作员,你可以用字符^分割当前的匹配,第0个是你的系数,第1个是你的指数。

    Pattern pattern = Pattern.compile("([^ ]+)");
    Matcher matcher = pattern.matcher("x^5 + 22.6x^4 - x^3 - 41.3x^1 + 4.2");

    while (matcher.find()) {
        String match = matcher.group(1);
        if (Arrays.asList("+", "-").contains(match)) {
            // something you do with operators
        }

        if (match.matches(".*\\^.*")) {
            // your match is 'x^y' format
            String[] split = match.split("\\^");
            String coefficient = split[0]; // your coefficient
            String exponent = split[1]; // your exponent

            System.out.println(coefficient + " ^ "+exponent); // see your result

        } else {
            // something you do when the current variable doesn't have an exponent
        }
    }

答案 1 :(得分:0)

拆分那个字符串并不复杂。但是你需要一些关于正则表达式的知识。

我先给你一个代码片段:

String poly = "x^5 + 22.6x^4 - x^3 - 41.3x + 4.2";
String[] terms = poly.replace(" ", "").split("(?=\\+|\\-)");
System.out.println(Arrays.toString(terms));

Map<Integer, Double> analyzed = new HashMap<>();
for (String term : terms)
{
    String[] splitAroundX = term.split("x", 2);
    int exponent = 0;
    if (splitAroundX.length > 1)
    {
        String sExp = splitAroundX[1].replace("^", "");
        exponent = sExp.isEmpty() ? 1 : Integer.parseInt(sExp);
    }
    String sCoeff = splitAroundX[0];
    double coefficient =
        sCoeff.isEmpty() ? 1.0 : ("-".equals(sCoeff) ? -1.0 : Double.parseDouble(sCoeff));
    analyzed.put(Integer.valueOf(exponent), Double.valueOf(coefficient));
}
System.out.println(analyzed);

请注意,这仅适用于语法正确的多项式。

那里有一些解析陷阱。例如,你必须处理空字符串,它代表值&#34; 1&#34;有时候。

然而,主要问题是使正则表达式正确。

第一个是表达式(?=\\+|\\-)。这使用交替组,因为你想匹配&#34; +&#34;或者&#34; - &#34;。此外,您希望在分割时保持操作员符号,因为它也是系数的符号。为此,您必须使用正向前瞻(&#34;?=&#34;部分)。

详细了解http://www.regular-expressions.info/上的正则表达式。

第二个是分裂&#34; x&#34;但固定限制为2.这允许拆分功能也拆分术语&#34; -41.3x&#34;进入数组{"-41.3", ""}。没有限制,它只会是一个1长的数组,而且没有&#34; x&#34;一点都不。

当然我最初删除了所有空格,因为这样只会简化解析。

上面的两个输出语句产生以下结果:

  

[x ^ 5,+ 22.6x ^ 4,-x ^ 3,-41.3x,+ 4.2]

     

{0 = 4.2,1 = -41.3,3 = -1.0,4 = 22.6,5 = 1.0}