【问题标题】:String to Integer Expressions字符串到整数表达式
【发布时间】:2016-09-26 03:42:01
【问题描述】:

我正在尝试将作为字符串给出的表达式转换为整数。例如。如果给定“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));
            }
    }

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

我打算使用相同的循环进行加减除法

【问题讨论】:

  • 我很确定你今天早些时候发布了一个完全相同的副本......请不要重新发布完全相同的问题,它不鼓励并且非常不受欢迎。
  • 你是如何运行它的?
  • 请对表达式解析做一些研究。基本上,您需要从左到右遍历字符串,寻找表达式中的数字和运算符lexemes,并在它们出现时使用它们。当您最终以错误的顺序进行操作时,搜索运算符并试图找到它们旁边的数字很可能会导致悲伤。

标签: java arrays string arraylist integer


【解决方案1】:

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

我看到一篇文章可以帮助您了解如何实现这一目标:

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);
    }

【讨论】:

    【解决方案2】:

    试试这个。

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 2011-05-09
      相关资源
      最近更新 更多