2013-05-23 4 views
0

Я пытаюсь упростить эту инструкцию if, чтобы избежать повторения кода и операторов if. Я также хочу иметь возможность передать более двух аргументов. т. е. 5 + 10 * 2/2. Есть идеи?Упростите это утверждение if в JAVA

public static double randomExpressionDraft(String exp){ 
     double primeResult = 0; 
     double newResult = 0; 
     for(int i=0;i<exp.length();i++) 
     { 

     if(exp.charAt(i)=='*') 
     { 
      newResult=Integer.parseInt(exp.substring(0, i)) * Integer.parseInt(exp.substring(i+1, exp.length())); 
      primeResult = newResult; 
      System.out.println(primeResult); 
     } 
     else if(exp.charAt(i)=='/') 
     { 
      newResult=Integer.parseInt(exp.substring(0, i))/Integer.parseInt(exp.substring(i+1, exp.length())); 
      primeResult = newResult; 
      System.out.println(primeResult); 
     } 
     else if(exp.charAt(i)=='+') 
     { 
      newResult=Integer.parseInt(exp.substring(0, i)) + Integer.parseInt(exp.substring(i+1, exp.length())); 
      primeResult = newResult; 
      System.out.println(primeResult); 
     } 
     else if(exp.charAt(i)=='-') 
     { 
      newResult=Integer.parseInt(exp.substring(0, i)) - Integer.parseInt(exp.substring(i+1, exp.length())); 
      primeResult = newResult; 
      System.out.println(primeResult); 
     } 

     } 
     return primeResult; 
    } 
+0

один лучший способ является то, что использование выключателя, без перерыва и по умолчанию использовать два утверждения т.е., primeResult = newResult; и System.out.println (primeResult); –

+0

Ваш код также не будет оценивать, чтобы исправить ответ, так как вы не рассматриваете *,/first –

+1

Не отправляйте тот же вопрос, потому что вам не понравились ответы. Измените исходный вопрос. –

ответ

0

Ваш цикл должен получить эту операцию */-+

Integer.parseInt(exp.substring(0, i)) Переместить на функцию, например, getLeftArg

Сделайте то же самое для Integer.parseInt(exp.substring(i+1, exp.length()));, например. getRightArg

затем создать новый метод с PARAMS leftArg, rightArg, операция

, как остальная часть кода такая же

т.е.

newResult= newMethod (leftArg, rightArg, operation) 

, который делает ваш расчет плюс primeResult = newResult; System.out.println(primeResult);

0

С Java не имеет что-то вроде делегатов, вы не сможете реализовать как цикл, как вы хотите, если вы не определяете каждого оператора в объекте. Если вы хотите, простейший код, вот решение по Маурисио из similar question:

ScriptEngineManager scm = new ScriptEngineManager(); 
ScriptEngine jsEngine = scm.getEngineByName("JavaScript"); 
double primeResult = (double)jsEngine.eval(exp); 

Да, получить двигатель JavaScript для вычисления арифметических выражений немного перебор. Тем не менее, он, очевидно, может обрабатывать несколько операторов, поэтому вам не нужно его самостоятельно разбирать.

0

Я думаю, что самым изящным подходом для этой проблемы будет использование типов полиморфизма и перечисления вместо операторов switch.

Этот код приведен ниже Эффективная Java - глава 6, Джошуа Блох.

public enum Operation { 
    PLUS("+") { 
     double apply(double x, double y) { return x + y; } 
    }, 
    MINUS("-") { 
     double apply(double x, double y) { return x - y; } 
    }; 
    private final String symbol; 
    Operation(String symbol) { this.symbol = symbol; } 
    @Override public String toString() { return symbol; } 

    abstract double apply(double x, double y); 

    private static final Map<String, Operation> stringToEnum = new HashMap<>(); 
    static { 
     for(Operation op : values()) 
      stringToEnum.put(op.toString(), op); 
    } 
    public static Operation fromString(String symbol) { 
     return stringToEnum.get(symbol); 
    } 
} 

Затем применить операцию:

double result = Operation.fromString("+").apply(1, 1); // 2.0 
result = Operation.fromString("-").apply(1,1); // 0.0 
Смежные вопросы