需要有关代码java效率的建议

时间:2017-03-08 16:14:45

标签: java calculator coding-efficiency

我是java编程的新手,我刚刚创建了一个计算器程序,它似乎运行正常,但其他程序员似乎在他们的计算器程序中使用“解析很多”。只是想问一下我是采取了错误的方法,并且可能在将来使用这种逻辑遇到问题。谢谢。

class Refresh {

private final String a;
private final String b;
private final String c;
private final String d;
private double x, y;

public Refresh() {
    a = "Enter the first number: ";
    b = "Enter the function; ";
    c = "Enter the second number: ";
    d = "The result is: ";
}

public void types() {
    Scanner typ = new Scanner(System.in);

    try {
        System.out.println(a);
        x = typ.nextDouble();
    } catch (InputMismatchException e) {
        System.out.println("Please use only numbers!");
        System.exit(1);
    }
    System.out.println(b);
    String func = typ.next();

    try {
        System.out.println(c);
        y = typ.nextDouble();
    } catch (InputMismatchException e) {
        System.out.println("Please use only numbers!");
        System.exit(1);
    }

    switch (func) {

        case "+":
            System.out.println(d + (x + y));
            break;

        case "-":
            System.out.println(d + (x - y));
            break;
        case "/":
            if (y == 0) {

                System.out.println("Cannot divide by zero!");
            } else {
                System.out.println(d + (x / y));
            }
            break;
        case "*":
            System.out.println(d + (x * y));
            break;

        default:
            System.out.println(func + " is not valid function");
    }
}

    public static void main(String[] args) {
        Refresh fin = new Refresh();
        fin.types();
    }
}

4 个答案:

答案 0 :(得分:0)

解析只是意味着扫描一组字符然后将它们分成它们自己的结构(将它们标记化)。

String aStr = "10";

变量aStr的类型为String。然后你可以解析字符串。

int aInt = Integer.parseInt(aStr);

答案 1 :(得分:0)

只是为了您的信息,Java有一个内置的计算器库。

ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByName("JavaScript");
String result = "100/10";
System.out.println(scriptEngine.eval(result));

答案 2 :(得分:0)

好吧,这实际上是非常基本的例子。老实说,你做得很好。甚至在此时提出这个问题更好。通常人们会在学习过程中忽视效率并且为时已晚。

他们为什么要解析?

如果你不知道下面的内容,那么你应该再试一次reading

扫描仪读取用户的所有关键输入。让我们举个例子

输入数字> 12

扫描仪将保留12\n

现在你看到了吗?扫描仪坚持只是数字它实际上是保持一个字符串。其中包含12\n

当您询问扫描仪nextDouble时,它会给您12

但是它仍然坚持\n所以下一个字符串输入,字符串\n将被分配。

通过解析,您将忽略此问题。并且您可以更好地控制用户输入。

答案 3 :(得分:0)

您的程序可以作为演示或学习Java的一步,但您可能不会将其用作生产程序。原因是您的代码假定命令行界面(static void main(),Scanner,System.out.println())。

用户现在习惯于使用图形解决方案。他们希望输入和输出在图形前端给出,计算应该在单独的逻辑中完成。

在这个视图中,我将分三部分重构您的程序:

  • 执行计算的后端类(以下示例代码中的Calculator类)
  • 一个前端类(在下面称为SimpleFrontEnd),它基于您的代码构建,但稍后可以替换为例如网络界面
  • 要在后端和前端之间进行通信的数据对象(下面的计算类将信息从前端发送到后端)

拥有这三个部分,您可以相互独立地修改它们。您可以决定在前端只输入一个String,然后在发送到后端之前对其进行解析。

我可能不会在前端使用需要解析的单个String,而是直接映射到下面的Calculation类的JSON对象,原因如下:前端可以轻松修改操作数和运算符JSON对象彼此独立,而修改必须解析的字符串则更复杂。

以下是将前端与后端分开的示例代码:

public class Calculation {
    private double leftOperand;
    private String operator;
    private double rightOperand;

    public double getLeftOperand() {
        return leftOperand;
    }

    public void setLeftOperand(double leftOperand) {
        this.leftOperand = leftOperand;
    }

    public String getOperator() {
        return operator;
    }

    public void setOperator(String operator) {
        this.operator = operator;
    }

    public double getRightOperand() {
        return rightOperand;
    }

    public void setRightOperand(double rightOperand) {
        this.rightOperand = rightOperand;
    }
}

public class Calculator {
    public double calculate(Calculation calculation) {
        switch (calculation.getOperator()) {
            case "+":
                return calculation.getLeftOperand() + calculation.getRightOperand();
            case "-":
                return calculation.getLeftOperand() - calculation.getRightOperand();
            case "/":
                if (calculation.getRightOperand() == 0) {
                    throw new IllegalArgumentException("Cannot divide by zero!");
                }
                return calculation.getLeftOperand() / calculation.getRightOperand();
            case "*":
                return calculation.getLeftOperand() * calculation.getRightOperand();
            default:
                throw new IllegalArgumentException(String.format("%s is not valid function", calculation.getOperator()));
        }
    }
}

public class SimpleFrontEnd {
    public static void main(String[] args) {
        try {
            //1. input, could be later replaced with a front end
            Scanner typ = new Scanner(System.in);
            System.out.println("Enter the first number: ");
            double x = typ.nextDouble();
            System.out.println("Enter the function: ");
            String func = typ.next();
            System.out.println("Enter the second number: ");
            double y = typ.nextDouble();

            //2. store input in an data object that will be sent to the back end (later on, a web interface could send this as a JSON)
            Calculation calculation = new Calculation();
            calculation.setLeftOperand(x);
            calculation.setOperator(func);
            calculation.setRightOperand(y);

            //3. retrieve the result from the back end
            Calculator calculator = new Calculator();
            try {
                double result = calculator.calculate(calculation);
                System.out.println(String.format("The result is: %f", result));
            } catch (IllegalArgumentException e) {
                System.out.println(e.getMessage());
            }
        } catch (InputMismatchException e) {
            System.out.println("Please use only numbers!");
        }
    }
}