将四种方法合为一



如何用一个更新变量"str"以将运算符"+-/*"与"ADD、SUB、div或MULT"匹配的方法替换四个方法?当它运行case语句时,我试图弄清楚如何让case语句识别通过扫描仪输入选择的运算符,并将其与相应的描述符字符串匹配。

    import java.util.Scanner;
    public class Testor4 {
    public static void main(String[] args) {
    String s1 = getInput("Enter a number: ");
    String s2 = getInput("Enter second number");
    String op = getInput("Enter operator: + - / * ");
    double result = 0;
    String str = " You chose to";
    try{
        switch(op){
        case "+": str += getOpNameAdd(str); result = getSum(s1,s2); break;
        case "-": str += getOpNameSub(str); result = getSub(s1,s2); break;
        case "/": str += getOpNameDiv(str); result = getDiv(s1,s2); break;
        case "*": str += getOpNameMult(str); result = getMult(s1,s2); break;
        default: System.out.println("not an operator."); return;
        }
    }catch(Exception e){
        System.out.println(e.getMessage());
    }
    System.out.printf("%s%s%.2f","Result is: ",str,result);
    }
    private static double getSum(String s1, String s2){
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 + d2;
    }
    private static double getSub(String s1, String s2){
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 - d2;
    }
    private static double getDiv(String s1, String s2){
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 / d2;
    }
    private static double getMult(String s1, String s2){
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 * d2;
    }
    public static String getOpNameAdd(String str){
    return str = " ADD!";
    }
    public static String getOpNameSub(String str){  
    return str = " Subtract!";
    }
    public static String getOpNameDiv(String str){  
    return str = " Divide!";
    }
    public static String getOpNameMult(String str){ 
    return str = " Multiply!";
    }
    public static String getInput(String prompt){
    System.out.println(prompt);
    Scanner sc = new Scanner(System.in);
    return sc.nextLine();
    }
    }

为什么不这样做?

try{
    switch(op){
    case "+": str += " ADD!"; result = getSum(s1,s2); break;
    case "-": str += " Subtract!"; result = getSub(s1,s2); break;
    case "/": str += " Divide!"; result = getDiv(s1,s2); break;
    case "*": str += " Multiply!"; result = getMult(s1,s2); break;
    default: System.out.println("not an operator."); return;
    }
}catch(Exception e){
    System.out.println(e.getMessage());
}

如果字符串将在其他地方重复使用,您也可以使其成为字符串常量:

public static final String OpNameAdd = " ADD!";
public class Testor4 {
public static void main(String[] args) {
    String s1 = getInput("Enter a number: ");
    String s2 = getInput("Enter second number");
    String op = getInput("Enter operator: + - / * ");
    double result = 0;
    String str = " You chose to";
    try {
        switch (op) {
        case "+":
            str += getOpName(op);
            result = getSum(s1, s2);
            break;
        case "-":
            str += getOpName(op);
            result = getSub(s1, s2);
            break;
        case "/":
            str += getOpName(op);
            result = getDiv(s1, s2);
            break;
        case "*":
            str += getOpName(op);
            result = getMult(s1, s2);
            break;
        default:
            System.out.println("not an operator.");
            return;
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
    System.out.printf("%s%s%.2f", "Result is: ", str, result);
}
private static double getSum(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 + d2;
}
private static double getSub(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 - d2;
}
private static double getDiv(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 / d2;
}
private static double getMult(String s1, String s2) {
    double d1 = Double.parseDouble(s1);
    double d2 = Double.parseDouble(s2);
    return d1 * d2;
}
public static String getOpName(String op) {
    String opName = "not an operator.";
    switch (op) {
    case "+":
        opName = " ADD!";
        break;
    case "-":
        opName = " Subtract!";
        break;
    case "/":
        opName = " Divide!";
        break;
    case "*":
        opName = " Multiply!";
        break;
    }
    return opName;
}
public static String getInput(String prompt) {
    System.out.println(prompt);
    Scanner sc = new Scanner(System.in);
    return sc.nextLine();
}

}

我将首先编写一个enum(如此处的Operation)来封装行为、名称和符号。类似

enum Operation {
    ADD("+", "Addition"), SUBTRACT("-", "Subtraction"), //
    MULTIPLY("*", "Multiplication"), DIVIDE("/", "Division");
    String operSymbol;
    String operName;
    Operation(String operSymbol, String operName) {
        this.operSymbol = operSymbol;
        this.operName = operName;
    }
    String getName() {
        return operName;
    }
    String getSymbol() {
        return operSymbol;
    }
    public static Operation fromString(String str) {
        if (str != null) {
            str = str.trim();
            if (!str.isEmpty()) {
                for (Operation o : Operation.values()) {
                    if (str.equals(o.getSymbol())) {
                        return o;
                    }
                }
            }
        }
        return null;
    }
    public double performOperation(String s1, String s2) {
        Double d1 = Double.parseDouble(s1);
        Double d2 = Double.parseDouble(s2);
        switch (this) {
        case SUBTRACT:
            return d1 - d2;
        case MULTIPLY:
            return d1 * d2;
        case DIVIDE:
            return d1 / d2;
        case ADD:
        default:
            return d1 + d2;
        }
    }
}

请不要为每个提示打开新的扫描仪。我会把它传递到方法中。比如

public static String getInput(Scanner sc, String prompt) {
    System.out.println(prompt);
    return sc.nextLine();
}

那么main方法非常简单,您可以在类似的Operation上获得所需的输入和调用方法

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    String s1 = getInput(sc, "Enter a number: ");
    String s2 = getInput(sc, "Enter second number");
    String op = getInput(sc, "Enter operator: + - / * ");
    try {
        Operation oper = Operation.fromString(op);
        if (op != null) {
            double result = oper.performOperation(s1, s2);
            System.out.printf("%s %s %s = %.2f (%s)%n", s1, //
                    oper.getSymbol(), s2, result, oper.getName());
        } else {
            System.out.println("not an operator.");
            return;
        }
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

以下是我的操作方法。从一个接口开始:

package cruft.arithmetic;
/**
 * BinaryOperation is the interface for binary arithmetic operations +, -, *, /
 * Created by Michael
 * Creation date 1/11/2016.
 * @link https://stackoverflow.com/questions/34734228/combining-four-methods-into-one
 */
public interface BinaryOperation<T>  {
    T execute(T argument1, T argument2);
}

添加实施:

package cruft.arithmetic;
/**
 * Addition implementation for BinaryOperation
 * Created by Michael
 * Creation date 1/11/2016.
 * @link https://stackoverflow.com/questions/34734228/combining-four-methods-into-one
 */
public class AddOperation implements BinaryOperation<Double> {
    @Override
    public Double execute(Double argument1, Double argument2) {
        return argument1 + argument2;
    }
}

这是测试仪:

package cruft.arithmetic;
/**
 * I think the class name is misspelled: "Tester".
 * Created by Michael
 * Creation date 1/11/2016.
 * @link https://stackoverflow.com/questions/34734228/combining-four-methods-into-one
 */
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Tester {
    private static final Map<String, BinaryOperation<Double>> OPERATIONS = new HashMap<String, BinaryOperation<Double>>() {{
        put("+", new AddOperation());
    }};
    private static Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
        BinaryOperation<Double> operator = null;
        do {
            try {
                String arg1 = getInput("1st argument    : ");
                String arg2 = getInput("2nd argument    : ");
                String oper = getInput("operator + - * /: ");
                operator = OPERATIONS.get(oper);
                if (operator != null) {
                    double x = Double.parseDouble(arg1);
                    double y = Double.parseDouble(arg2);
                    double z = operator.execute(x, y);
                    System.out.println(String.format("%-10.4f %s %-10.4f = %-10.4f", x, oper, y, z));
                } else {
                    System.out.println(String.format("No such operator '%s'", oper));
                }
            } catch (NumberFormatException e) {
                e.printStackTrace();
            }
        } while (operator != null);
    }
    public static String getInput(String prompt) {
        System.out.print(prompt);
        return sc.nextLine();
    }
}

使用一种更简单的方法,您可以读取一个输入并处理字符串"前缀+后缀",其中+代表所有可能的操作,使用静态int indexOfAny(String str,char[]searchChars)获取子字符串前缀、后缀,然后根据运算符切换(op)。

最新更新