2014-11-12 4 views
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+",""); Так что я удаляю все пробелы. Когда я использую метод split.

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

Мои выходы:

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

Но это не ответ. Используя один метод разделения, я разделим все части.

Но я хочу разделить строки при использовании специального кода «+» и «-» вместе. Но я не стал снова. Не удаляя пробелы, могу ли я разделить строки?

+0

http://stackoverflow.com/q/114586/1007273 – hovanessyan

+2

У Вас try 's2.split (" \\ + ")'? Также обратите внимание, что это приведет к «удалению» этих операторов, поэтому вам может быть лучше просто сплит в пространствах, поэтому вы получите последовательность, такую ​​как оператор оператора (оператор) term ... –

ответ

0

Один из способов - перебрать все подстроки вашего полинома, которые не содержат пробелов (в основном все переменные и сам оператор). Тогда вы можете решить, видите ли вы оператор или что-то еще в вашей текущей итерации и обрабатываете их отдельно. вы не смотрите на операторе, вы можете просто разделить ваш текущий матч по характеру ^, и 0-я находка вашего коэфф и 1th ваш показатель.

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 
     } 
    } 
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».

Основная проблема - однако - получить правильные выражения вправо.

Первый - это выражение (?=\\+|\\-). Это использует группу чередования , потому что вы хотите соответствовать либо «+», либо «-». Кроме того, вы хотите сохранить знак оператора при расщеплении, так как это также знак для коэффициента. Для этого вы должны использовать положительный 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}

Смежные вопросы