1

私は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+","");したがって、すべての空白を削除します。分割方法を使用する場合。

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

私の出力は次のとおりです。

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

しかし、それは答えではありません。一つの分割方法を使って、すべてのパーツを分割していきます。

しかし、特殊コード「+」と「-」が一緒の場合、文字列を分割したいと思います。しかし、私は再びしませんでした。空白を削除せずに文字列を分割できますか?

4

2 に答える 2

0

1 つの方法は、空白を含まないポリノームのすべての部分文字列 (基本的にすべての変数と演算子自体) を反復処理することです。次に、現在の反復で演算子または何か他のものを確認し、それらを個別に処理するかどうかを決定できます。そうでない場合演算子を見てください。現在の一致を文字 ^ で分割するだけで、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
        }
    }
于 2014-11-12T09:26:13.127 に答える
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);

これは、構文的に正しい多項式でのみ機能することに注意してください。

そこにはいくつかの解析の落とし穴があります。たとえば、値「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}

于 2014-11-12T09:43:47.150 に答える