2013-05-23 2 views
0

코드 반복 및 if 문을 피하기 위해이 if 문을 단순화하려고합니다. 또한 2 개 이상의 인수를 전달할 수 있기를 원합니다. 즉 5 + 10 * 2/2이다. 어떤 아이디어?자바에서이 if 문을 단순화하십시오.

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 즉 사용합니다 :

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

그런 작업을 적용 할 및 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 새로운 방법을 만들

코드의 나머지 부분은 이후 계산 플러스 primeResult = newResult; System.out.println(primeResult);

0

을 수행하는 같은

newResult= newMethod (leftArg, rightArg, operation) 

그대로 자바에는 델리게이트와 같은 것이 없으므로 각 연산자를 정의하지 않는 한 원하는대로 루프를 구현할 수 없습니다. 개체에서.

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

예, 산술 식을 평가하기 위해 자바 스크립트 엔진을 점점 비트 잔인한 : 당신이 가장 간단한 코드를 원하는 경우에, 여기에 similar question에서 마우에 의한 솔루션입니다. 그러나 분명히 여러 연산자를 처리 할 수 ​​있으므로 직접 구문 분석 할 필요가 없습니다.

0

이런 종류의 문제에 대한 가장 우아한 방법은 switch 문 대신 Polymorphism과 enum 형식을 사용하는 것이라고 생각합니다.

아래 코드는 Effective Java - 6 장, Joshua Bloch의 코드입니다. 쉬지 않고,

double result = Operation.fromString("+").apply(1, 1); // 2.0 
result = Operation.fromString("-").apply(1,1); // 0.0