Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何仅使用一种方法制作此计算器?_Java_Methods - Fatal编程技术网

Java 如何仅使用一种方法制作此计算器?

Java 如何仅使用一种方法制作此计算器?,java,methods,Java,Methods,我在试着做这个计算器 我可以使用4种方法,一种是加法,一种是减法,还有。。。。。但我想让它尽可能简单。 如何使用一个方法执行4个主要操作,然后在static main中调用它 package com.company; import java.util.Scanner; public class Main { final static String first = "first number: "; final static String sec = &qu

我在试着做这个计算器 我可以使用4种方法,一种是加法,一种是减法,还有。。。。。但我想让它尽可能简单。 如何使用一个方法执行4个主要操作,然后在static main中调用它

package com.company;

import java.util.Scanner;

public class Main {
    final static String first = "first number: ";
    final static String sec = "second number: ";

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("what do you want to use? (multiply (input *), divide (input /), subtract (input -), addition (input +)");
        String input = scanner.nextLine();
        double answer = calculation(input);                 ----------------------
        System.out.println(answer);
    }
    public static double calculation(double element){       ----------------------
        Scanner scanner = new Scanner(System.in);
        System.out.println(first);
        double firstInput = scanner.nextDouble();
        System.out.println(sec);
        double secInput = scanner.nextDouble();
        return firstInput element secInput;                 ----------------------
    }
}
我可以将
元素
更改为(
+-*/
)吗?
(部分是我有问题吗)

你可能想看看OOP原理,使用继承和多态性,你应该能够在一个接口中定义一个方法,在你的类中定义它的多个实现,因此,您可以有一个带有execute方法的计算接口,然后使用类Sum实现该接口,其中execute方法执行实和

public interface Calculation {
    Double execute(Double a, Double b);
}

public class Sum implements Calculation {
    @Override
    public Double execute(Double a, Double b) {
        return a+b;
    }
}

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("what do you want to use? (multiply => *, divide => /, subtract => -, addition => +");
        String input = scanner.nextLine();
        Calculation calculation;
        if (input.equals("+")) calculation = new Sum();
        else calculation = new Sum();// Just initializing calculation to avoid compilation error
        double answer = execute(calculation);
    }

    private static double execute(Calculation calculation){
        Scanner scanner = new Scanner(System.in);
        double firstInput = scanner.nextDouble();
        System.out.println(firstInput);
        double secInput = scanner.nextDouble();
        System.out.println(secInput);
        return calculation.execute(firstInput, secInput);
    }
}

您可以使用
enum
lambda
函数执行它。这种方法允许您轻松地向代码中添加操作,而无需重写计算方法。 首先,将
Scanner
一起使用
try with resources
或调用
Scanner。在
Scanner
之后,不再需要关闭()。那么最好不要创建两个
扫描仪
对象
,而只需将输入部分合并到一个方法中(如果仍要使用两个
Scanner
实例,请记住将
System.in
包装到decorator中,以防止其关闭)。您还可以添加一些验证来防止输入错误(并让用户再次尝试输入数据)。其主要思想是创建enum,该enum为应用于数字对的每个操作都包含一个
双函数
。它可能是这样的:

公共类主{
私有最终静态字符串first=“第一个数字:”;
私有最终静态字符串sec=“第二个数字:”;
公共静态void main(字符串[]args){
try(扫描器=新扫描器(System.in)){
字符串operationTypes=Arrays.stream(OperationType.values())
.map(type->String.format(“%s(输入%s)”,type.toString(),type.sign))
.collect(收集器.连接(“(”,“,”,“,”));
System.out.println(“您想使用什么?”+操作类型);
字符串输入=scanner.nextLine();
System.out.println(第一);
double firstInput=scanner.nextDouble();
系统输出打印项次(秒);
double secInput=scanner.nextDouble();
OperationType OperationType=OperationType.fromSign(输入).OrelsThrow();
双答案=计算(操作类型、第一输入、第二输入);
System.out.println(应答);
}
}
公共静态双重计算(OperationType OperationType、double firstInput、double secInput){
返回operationType.operation.apply(firstInput,secInput);
}
枚举操作类型{
加(“+”,Double::sum),
减去(“-”,(a,b)->a-b),
乘(“*”,(a,b)->a*b),
除以(“/”,(a,b)->a/b);
字符串符号;
双功能操作;
操作类型(字符串符号、双功能操作){
这个符号=符号;
这个操作=操作;
}
公共静态可选fromSign(字符串符号){
返回Arrays.stream(OperationType.values())
.filter(operationType->operationType.sign.equals(符号))
.findAny();
}
@凌驾
公共字符串toString(){
返回此.name().toLowerCase();
}
}
}

你确定
元素
应该是
double
类型吗?我知道不应该是,但我不知道用什么来代替itelement应该是枚举类型。好的,我会给它一个trynope枚举不起作用(或者我不知道如何使用它)你能给我一个源代码或者一些我能更好理解的东西吗(我刚刚编辑了我的原始答案,这对你有帮助吗?很好,你了解代码背后的原理吗?这些OOP原则对于一个设计良好的应用程序来说非常重要,现在对你来说可能不是必要的,但是如果你需要进一步的解释,我很乐意帮助你。是的,谢谢你,我不理解,正在浏览你的答案。)utube xD,一个解释会非常有用。所以,我认为您应该注意的第一件事是如何使用多态性,这是一个棘手的概念,直到您开始将其付诸实践。它基本上意味着当您有一个父类或接口时,您可以在您自己的类中重写其方法,并在不同的类中执行不同的逻辑这基本上解释了为什么你可以声明
Calculation
,然后在
Sum
中重写它的方法。Thaaanks它起作用了。我想我要学习enum了