字符串到整数表达式

时间:2016-09-26 03:42:02

标签: java arrays string arraylist integer

我正在尝试将作为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));
            }
    }

由于我无法导入任何库,我的行动计划是每次操作完成后都替换String。

我计划使用相同的循环来添加,减去和分割

2 个答案:

答案 0 :(得分: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);
    }

答案 1 :(得分: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