拆分该字符串并不复杂。但是你需要一些关于正则表达式的知识。
我先给你一个代码片段:
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);
请注意,这只适用于语法正确的多项式。
那里有一些解析陷阱。例如,您必须处理空字符串,这些字符串有时表示值“1”。
然而,主要问题是正确使用正则表达式。
第一个是表达式(?=\\+|\\-)
。这使用了一个交替组,因为您想在“+”或“-”上进行匹配。此外,您希望在拆分时保留运算符符号,因为它也是系数的符号。为此,您必须使用积极的前瞻(“?=”部分)。
在http://www.regular-expressions.info/上阅读更多关于正则表达式的信息。
第二个是围绕“x”拆分,但固定限制为 2。这允许拆分函数也将术语“-41.3x”拆分为数组{"-41.3", ""}
。如果没有这个限制,它只会是一个长度为 1 的数组,而且根本没有“x”,这将是模棱两可的。
当然,我最初删除了所有空格,因为这只会使解析变得容易得多。
上面的两个输出语句产生以下结果:
[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}