2016-09-26 49 views
-1

我想将作为字符串给出的表达式转换为整数。例如。如果给出“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

考虑解析表达式。您可以使用前缀,中缀或后缀表示法和解析来评估输入表达式。

我读到一篇文章,可以帮助您了解如何实现这一点:要解决这个问题,不同的方法

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