#java #calculator
#java #калькулятор
Вопрос:
Я пытаюсь написать калькулятор для - * /
без условий. Оператор хранится в виде строки.
Есть ли способ достичь этого?
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
////String Operator = "";
String L1="";
String L2="";
String op = " ";
double a = 3;
double b = 2;
//Operator p = p.
Operator p;
b = Operator.count(a, op, b);
System.out.println(b);
}
public enum Operator {
PLUS(" "), MINUS("-"), DIVIDE("/"), MULTIPLY("*");
private final String operator;
public static double count(double a,String op,double b) {
double RetVal =0;
switch (Operator.valueOf(op)) {
case PLUS:
RetVal= a b;
case MINUS:
RetVal= a - b;
case DIVIDE:
RetVal= a / b;
case MULTIPLY:
RetVal= a * b;
}
return RetVal;
}
Operator(String operator) {
this.operator = operator;
}
// uniwersalna stała grawitacyjna (m3 kg-1 s-2)
}
}
Получил эту ошибку:
Исключение в потоке «main» java.lang.Исключение IllegalArgumentException: нет перечисления const класса Main$Operator.
Есть какие-нибудь подсказки?
Комментарии:
1. Есть много способов достичь этого. Пожалуйста, задавайте конкретные вопросы, и мы будем рады вам помочь.
2. Я бы использовал встроенный интерпретатор Javascript.
3. Java по-прежнему работает по тьюрингу без if / else и case / switch, но зачем вам так ограничивать себя?
Ответ №1:
Вы могли бы использовать шаблон стратегии и сохранить стратегию вычисления для каждого оператора.
interface Calculation {
double calculate(double op1, double op2);
}
class AddCalculation implements Calculation {
double calculate(double op1, double op2) {
return op1 op2;
}
}
//others as well
Map<String, Calculation> m = ...;
m.put(" ", new AddCalculation());
Затем во время выполнения вы получаете объекты вычисления с карты и выполняете calculate()
.
Комментарии:
1. 1 Это видео содержит очень хороший пример именно для этой операции: youtube.com/watch?v=4F72VULWFvc
2. Конечно, технически, это просто скрывает условия, которые находятся в поиске по b-дереву.
3. @Software Monkey но вы не можете ожидать, что это получится без каких -либо скрытых где-либо условий.
Ответ №2:
я думаю, что использование enum было бы хорошим вариантом:
Enum Operation{
PLUS(" ")
MINUS("-")
DIVIDE("/")
MULTIPLY("*")
}
тогда вы могли бы использовать
switch(Operation.valueOf(userInputString)){
case PLUS: return a b;
case MINUS: return a-b;
case DIVIDE: return a/b;
case MULTIPLY: return a*b;
}
Комментарии:
1. Мне нравится этот ответ — но, к сожалению, OP ограничился «no switch».
2. Затем в Java 7 вы можете пропустить перечисление и напрямую использовать
case " "
.3. weeeeell теоретически, switch — это карта перехода счетчика программы, а не условие; P Это также объясняет, почему такие вещи, как case » «, довольно уродливы, потому что компилятору (я думаю) нужно вырождать switch в серию if (equal)elseif(equal)elseif(equal) вместо того, чтобы просто выполнять «jmp 4 * inputvalue» (так сказать)
Ответ №3:
как насчет хэширования? Хэшируйте операторы в виде пары ключ-значение (» «: ). Для строковой операции хэшируйте ее и извлекайте значение. Поэкспериментируйте с этим
Ответ №4:
Как упоминал Питер Лоури, ScriptEngine / JavaScript может быть хорошим выбором для этого. Посетите этот небольшой апплет-интерпретатор JavaScript, чтобы изучить возможности.
Комментарии:
1. И lisp тоже замечательный, или python… Но дело здесь не в этом. В противном случае это не было бы помечено как java.