2016-09-26 4 views
-1

Я пытаюсь преобразовать выражение, данное как String в Integer. Напр. если задано «1 + 5 * 5», метод должен вернуть «26». Я начал писать код только для решения умножения, однако, когда я запускаю его там не выходСтрока для целых выражений

public static void operationS(ArrayList<String> m) 
{ 
    for (int i=0; i<m.size(); i++) 
    { 
     while ((m.get(i)).contains("*")) 
     { 
      int x = ((m.get(i)).indexOf("*")); 
      char A=((m.get(i)).charAt(x-1)); 
      char B= ((m.get(i)).charAt(x+1)); 

      int r= Character.getNumericValue(A)*Character.getNumericValue(B); 

      String numberAsString = Integer.toString(r); 

      if(x==1 && (m.get(i)).length()==3) 
      { 
       m.set(i, numberAsString); 

      } 

      if(x==1 && (m.get(i)).length()>3) 
      { 
      String n = numberAsString+((m.get(i)).substring(x+2)); 
      m.set(i, n); 

      } 

      else 
      { 
       String k= ((m.get(i)).substring(0,x-1))+numberAsString+((m.get(i)).substring(x+2)); 
      } 

      } 
     } 
    for (int u=0;u<m.size();u++) 
      { 
      System.out.println (m.get(u)); 
      } 
    } 

Поскольку я не могу импортировать какую-либо библиотеки, мой план действий был заменив строку каждый раз, когда операция была завершена ,

Я планирую использовать один и тот же цикл для сложения, вычитания и деления

+0

Я уверен, что Вы отправили точную копию ранее сегодня ... пожалуйста, не перепечатывать точно такие же вопросы, это не рекомендуется и очень нахмурился. – Li357

+0

Как вы его используете? – immibis

+0

Проведите некоторое исследование по анализу выражений. В основном вам нужно пройти строку слева направо, ища _lexemes_, которые являются числами и операторами в выражении, и работать с ними по мере их появления. Поиск операторов и поиск номеров рядом с ними, скорее всего, приведет к горю, когда вы закончите работу в неправильном порядке. – ajb

ответ

0

Рассматривает синтаксический анализ выражения. Вероятно, вы можете использовать нотацию Prefix, Infix или Postfix и синтаксический анализ для оценки входного выражения.

я наткнулся на статью, которая может помочь вам в понимании того, как достичь этого:

http://www.sunshine2k.de/coding/java/SimpleParser/SimpleParser.html

В статье в основном говорит о различных подходах к решению этой проблемы.

Мне лично понравился рекурсивный подход. Поэтому, если вы понимаете рекурсию, вы можете это выбрать.

Но если у вас есть требование использовать только петлю, вы можете предпочесть один из других подходов.

Обновление: Добавление образца кусок кода, реализующего рекурсию, основанный на статье связаны выше.

static final char[] ops = { '-', '+', '*', '/'}; 

    static double evaluate(String s){ 
     for(char op: ops) { 
      if(s.contains(String.valueOf(op))){ 
       String op1 = s.substring(0, s.indexOf(op)); 
       String op2 = s.substring(s.indexOf(op) + 1, s.length()); 
       switch(op) { 
        case '-': return evaluate(op1) - evaluate(op2); 
        case '+': return evaluate(op1) + evaluate(op2); 
        case '*': return evaluate(op1) * evaluate(op2); 
        case '/': return evaluate(op1)/evaluate(op2); 
       } 
      } 
     } 
     /* at this point there is no operator in the term anymore, just a number */ 
     return (convertToDouble(s)); 
    } 

    private static double convertToDouble(String s) { 
     return Double.parseDouble(s); 
    } 
0

Попробуйте это.

static String replaceAll(CharSequence cseq, String regex, Function<MatchResult, String> replacement) { 
    Matcher matcher = Pattern.compile(regex).matcher(cseq); 
    StringBuffer sb = new StringBuffer(); 
    while (matcher.find()) { 
     String replaced = replacement.apply(matcher.toMatchResult()); 
     matcher.appendReplacement(sb, Matcher.quoteReplacement(replaced)); 
    } 
    matcher.appendTail(sb); 
    return sb.toString(); 
} 

static int toInt(String s) { 
    return Integer.parseInt(s); 
} 

И

String input = "1 + 5 * 5"; 
String output = input; 
while (true) { 
    String r = replaceAll(output, "(\\d+)\\s*\\*\\s*(\\d+)", 
     m -> "" + (toInt(m.group(1)) * toInt(m.group(2)))); 
    if (r.equals(output)) break; 
    output = r; 
} 
while (true) { 
    String r = replaceAll(output, "(\\d+)\\s*\\+\\s*(\\d+)", 
     m -> "" + (toInt(m.group(1)) + toInt(m.group(2)))); 
    if (r.equals(output)) break; 
    output = r; 
} 
System.out.println(input + " -> " + output); 

результат:

1 + 5 * 5 -> 26 
Смежные вопросы