Нарезка, что строка не так но вам нужны некоторые знания о регулярных выражениях.
Я дам вам сначала фрагмент кода:
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».
Основная проблема - однако - получить правильные выражения вправо.
Первый - это выражение (?=\\+|\\-)
. Это использует группу чередования , потому что вы хотите соответствовать либо «+», либо «-». Кроме того, вы хотите сохранить знак оператора при расщеплении, так как это также знак для коэффициента. Для этого вы должны использовать положительный lookahead (часть «? =»).
Подробнее о регулярных выражениях на http://www.regular-expressions.info/.
Второй - это расщепление вокруг «x», но с фиксированным пределом 2. Это позволяет разделить функцию также разделить термин «-41.3x» на массив {"-41.3", ""}
. Без лимита это будет всего лишь 1-удлиненный массив, и это будет двусмысленно без «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}
http://stackoverflow.com/q/114586/1007273 – hovanessyan
У Вас try 's2.split (" \\ + ")'? Также обратите внимание, что это приведет к «удалению» этих операторов, поэтому вам может быть лучше просто сплит в пространствах, поэтому вы получите последовательность, такую как оператор оператора (оператор) term ... –