将四种方法合并为一种

时间:2016-01-12 01:39:28

标签: java methods

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

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

5 个答案:

答案 0 :(得分:3)

为什么不这样做?

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!";

答案 1 :(得分:1)

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

}

答案 2 :(得分:1)

我首先要编写一个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());
    }
}

答案 3 :(得分:1)

以下是我的表现。从界面开始:

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

答案 4 :(得分:0)

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