その文字列を分割することはそれほど複雑ではありません。ただし、正規表現に関する知識が必要です。
最初にコード スニペットを示します。
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/を参照してください。
2 つ目は "x" を中心とした分割ですが、制限は 2 に固定されています。これにより、split 関数は項 "-41.3x" を配列に分割することもできます{"-41.3", ""}
。制限がなければ、長さが 1 の配列だけになり、"x" がまったくないためあいまいになります。
もちろん、最初はすべての空白を削除しました。これにより、解析がはるかに簡単になります。
上記の 2 つの出力ステートメントは、次の結果を生成します。
[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}