如何用一个更新变量的方法替换四个方法" 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();
}
}
答案 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)。