从字符串到整数函数

时间:2016-09-27 13:16:17

标签: java string function methods integer

我正在尝试编写一个程序,它将接收函数作为String并解决它。对于前者" 5 * 5 + 2 / 2-8 + 5 * 5-2"应该返回41

我编写了乘法和除法的代码,它完美无缺:

  public class Solver 
{
    public static void operationS(String m) 
    {
        ArrayList<String> z = new ArrayList<String>();
        char e= ' ';
        String x= " ";
        for (int i =0; i<m.length();i++)
        {
            e= m.charAt(i);
            x= Character.toString(e);


            z.add(x);
        }
         for (int i =0; i<z.size();i++)
            {
                System.out.print(z.get(i));
            }

        other(z);
    }

    public static void other(ArrayList<String> j)
    {
        int n1=0;
        int n2=0;
        int f=0;
        String n= " ";
          for (int m=0; m<j.size();m++)
          {

              if ((j.get(m)).equals("*"))
              {
                 n1 = Integer.parseInt(j.get(m-1));
                 n2 = Integer.parseInt(j.get(m+1));
                 f= n1*n2;
                 n = Integer.toString(f);

                 j.set(m,n);
                 j.remove(m+1);
                 j.remove(m-1);

                 m=0;
              }

              for (int e=0; e<j.size();e++)
              {

                  if ((j.get(e)).equals("/"))
                  {
                     n1 = Integer.parseInt(j.get(e-1));
                     n2 = Integer.parseInt(j.get(e+1));
                     f= n1/n2;
                     n = Integer.toString(f);

                     j.set(e,n);
                     j.remove(e+1);
                     j.remove(e-1);

                     e=0;
                  }

              }   
    }

          System.out.println();
          for (int i1 =0; i1<j.size();i1++)
            {
                System.out.print(j.get(i1)+",");
            }

然而,对于加法和减法,由于没有加减顺序,无论以哪个为先,我写了以下内容:

  int x1=0;
          int x2=0;
          int x3=0;
          String z = " ";

          for (int g=0; g<j.size();g++)
          {
              if ((j.get(g)).equals("+"))
              {
                  x1= Integer.parseInt(j.get(g-1));
                  x2= Integer.parseInt(j.get(g+1));
                  x3= x1+x2;
                  z = Integer.toString(x3);

                  j.set(g,z);
                  j.remove(g+1);
                  j.remove(g-1);

                  g=0;
              }
             g=0;

              if ((j.get(g)).equals("-"))
              {
                  x1= Integer.parseInt(j.get(g-1));
                  x2= Integer.parseInt(j.get(g+1));
                  x3= x1-x2;
                  z = Integer.toString(x3);

                  j.set(g,z);
                  j.remove(g+1);
                  j.remove(g-1);

                  g=0;
              }

              g=0;
          }

          System.out.println();
          for (int i1 =0; i1<j.size();i1++)
            {
                System.out.print(j.get(i1)+",");
            }

在此之后,它会打印:

  

25,+,1, - ,8,+,25, - ,2,

。我究竟做错了什么?乘法和除法似乎工作得很好

5 个答案:

答案 0 :(得分:3)

寻找一个对您确切的具体问题没有帮助的答案,但希望能帮助您远远超过这个。

乍一看,您的代码存在各种问题:

  1. 您正在使用超短变量名称。这可以节省你整整1分钟的打字;每次阅读代码时,您需要花费5,10,x分钟;或者向其他人展示。所以:不要这样做。使用名称来说明该名称背后的内容。
  2. 您正在使用大量低级代码。你使用“couting-for”循环迭代一个列表(称为 j ,这真的非常可怕!)。含义:你使你的代码阅读比它应该更复杂。
  3. 就这样,到目前为止,似乎没有人告诉你,但代码的概念是:它应该易于阅读和理解。可能你没有获得成绩,但请相信我:从长远来看,学习编写可读代码是一项非常重要的技能。如果这让你感到好奇,看看你是否能够得到罗伯特·马丁的“清洁代码”。并研究那本书。然后再研究一下。再一次。
  4. 但真正的问题是你解决这个问题的方法。我假设:这是学习任务的一部分。下一步将是你没有简单的表达,如“1 + 2 * 3”;但是你被要求处理类似“sqrt(2)+ 3”等的东西。然后你会被要求添加变量等等。然后你的整个方法就会分崩离析。因为你的简单字符串操作不再这样做了。

    从这个意义上说:你应该看看这个question,并仔细研究Boann的第二个答案,了解如何创建一个解析器,将输入字符串分解为表达式然后进行评估。你的代码“一起”做两件事;从而使增强所提供的功能变得非常困难。

答案 1 :(得分:3)

你有两个问题:

1)if和else之后的g=0;语句将使你进入无限循环。

2)从你给出的输出中,第一个减号( - )是Unicode字符HYPHEN-MINUS (U+002D),而第二个减号( - )是Unicode字符EN DASH (U+2013),所以(j.get(g)).equals("-")失败了第二个减去因为它们不相等。

答案 2 :(得分:0)

您可以使用内置的Javascript引擎

public static void main(String[] args) throws Exception{
    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine engine = mgr.getEngineByName("JavaScript");
    String code = "5*5+2/2-8+5*5-2";
    System.out.println(engine.eval(code));
}

答案 3 :(得分:0)

主要不要重复自己(DRY原则)。并使用抽象(全名,合理时提取方法)。使用多种方法时,静态方法有点麻烦。在这里使用单独的方法很方便。

也许你想要这样的东西:

Solver solver = new Solver();
List<String> expr = solver.expression("5*5+2/2-8+5*5-2");
String result = solver.solve(expr);

更抽象的Solver类可以:

class Solver {

    List<String> expression(String expr) {
        String[] args = expr.split("\\b");
        List<String> result = new ArrayList<>();
        Collections.addAll(result, args);
        return result;
    }

    String solve(List<String> args) {
        solveBinaryOps(args, "[*/]");
        solveBinaryOps(args, "[-+]");
        return args.stream().collect(Collectors.joining(""));
    }

以上solveBinaryOps接收正则表达式模式,或者只是以某种形式接收您想要处理的运算符。 它负责运算符优先级。

    private void solveBinaryOps(List<String> args, String opPattern) {
        for (int i = 1; i + 1 < args.length; ++i) {
            if (args.get(i).matches(opPattern)) {
                String value = evalBinaryOp(args.get(i - 1), args.get(i), args.get(i + 1));
                args.set(i, value);
                args.remove(i + 1);
                args.remove(i - 1);
                --i; // Continue from here.
            }
        }
    }

    private String evalBinaryOp(String lhs, String op, String rhs) {
        int x = Integer.parseInt(lhs);
        int y = Integer.parseInt(rhs);
        int z = 0;
        switch (op) {
        case "*":
            z = x * y;
            break;
        case "/":
            z = x / y;
            break;
        case "+":
            z = x + y;
            break;
        case "-":
            z = x - y;
            break;
        }
        return Integer.toString(z);
     }
}

以上几点可以改进。但它是可读的,可重写的。

答案 4 :(得分:0)

public class Solver {
public static void main(String args[]) {
    operation("5+2*5-6/2+1+5*12/3");
}

public static void operation(String m) {
    ArrayList<Object> expressions = new ArrayList<Object>();
    String e;
    String x = "";
    for (int i = 0; i < m.length(); i++) {
        e = m.substring(i, i + 1);
        if (!(e.equals("*") || e.equals("/") || e.equals("+") || e
                .equals("-"))) {
            x += e;
            continue;
        } else {
            if (!x.equals("") && x.matches("[0-9]+")) {
                int oper = Integer.parseInt(x);
                expressions.add(oper);
                expressions.add(m.charAt(i));
                x = "";
            }
        }
    }
    if (!x.equals("") && x.matches("[0-9]+")) {
        int oper = Integer.parseInt(x);
        expressions.add(oper);
        x = "";
    }
    for (int i = 0; i < expressions.size(); i++) {
        System.out.println(expressions.get(i));
    }
    evaluateExpression(expressions);
}

public static void evaluateExpression(ArrayList<Object> exp) {
    //Considering priorities we calculate * and / first and put them in a list mulDivList
    ArrayList<Object> mulDivList=new ArrayList<Object>();
    for (int i = 0; i < exp.size(); i++) {
        if (exp.get(i) instanceof Character) {
            if ((exp.get(i)).equals('*')) {
                int tempRes = (int) exp.get(i - 1) * (int) exp.get(i + 1);
                exp.set(i - 1, null);
                exp.set(i, null);
                exp.set(i + 1, tempRes);
            }
            else if ((exp.get(i)).equals('/')) {
                int tempRes = (int) exp.get(i - 1) / (int) exp.get(i + 1);
                exp.set(i - 1, null);
                exp.set(i, null);
                exp.set(i + 1, tempRes);
            }
        }
    }
    //Create new list with only + and - operations

    for(int i=0;i<exp.size();i++)
    {
        if(exp.get(i)!=null)
            mulDivList.add(exp.get(i));
    }
    //Calculate + and - .
    for(int i=0;i<mulDivList.size();i++)
    {
         if ((mulDivList.get(i)).equals('+')) {
            int tempRes = (int) mulDivList.get(i - 1) + (int) mulDivList.get(i + 1);
            mulDivList.set(i - 1, null);
            mulDivList.set(i, null);
            mulDivList.set(i + 1, tempRes);
        }
        else if ((mulDivList.get(i)).equals('-')) {
            int tempRes = (int) mulDivList.get(i - 1) - (int) mulDivList.get(i + 1);
            mulDivList.set(i - 1, null);
            mulDivList.set(i, null);
            mulDivList.set(i + 1, tempRes);
        }
    }
    System.out.println("Result is : " + mulDivList.get(mulDivList.size() - 1));

}
}