2015-02-07 2 views
0

계산기를 시뮬레이트하는 프로그램을 만들어야합니다. 우리는 연산자 클래스에서 해시 맵을 사용해야하지만 어떻게해야할지 모르겠습니다. 내가 이해할 수있는 기본 논리입니다. 우리는 1 + 2-3 * 4/5와 같은 간단한 표현을 프로그램에 보냅니다. 그러면 프로그램은이를 두 개의 스택으로 나눕니다. 하나는 연산자와 하나는 피연산자를 사용합니다. 문자를 나눌 때 우리는 연산자에 대한 해시 맵을 확인한 다음 스택으로 밀어 넣어야합니다. 이것이 내가 붙어있는 곳입니다. 어떻게/어디에서 해시 맵을 배치/사용합니까? 내 코드는 다음과 같습니다 :자바 - 해시 맵을 사용하여 간단한 수학 연산자를 매핑하는 방법

import java.util.*; 

public class Evaluator { 

    private Stack<Operand> opdStack; 
    private Stack<Operator> oprStack; 

    public Evaluator() { 
     opdStack = new Stack<Operand>(); 
     oprStack = new Stack<Operator>(); 
    } // end constructor 

    public int eval(String expr) { 
     String tok; 
     expr = expr + "!"; 

     String delimiters = "+-*/#! "; 
     StringTokenizer st = new StringTokenizer(expr, delimiters, true); 

     while (st.hasMoreTokens()) { 
      tok = st.nextToken(); 
      if(!tok.equals(" ")) { 
       if(Operand.check(tok)){ 
        opdStack.push(new Operand(tok)); 
       } 
       else{ 
        if (!Operator.check(tok)) { 
         System.out.println("*****invalid token******\n"); 
         System.exit(1); 
        } // end if 
       } // end else 
      } // end if 
     } // end while 
     return 0; 
    } // end eval 
} // end Evaluator 

abstract class Operator { 

    static HashMap operators = new HashMap(); 

    public abstract int priority(); 

    static boolean check(String tok) { 
     boolean result = false; 
     operators.put("#", new PoundOperator()); 
     operators.put("!", new ExclamationOperator()); 
     operators.put("+", new AdditionOperator()); 
     operators.put("-", new SubtractionOperator()); 
     operators.put("*", new MultiplicationOperator()); 
     operators.put("/", new DivisionOperator()); 

     if (operators.containsKey(tok)) { 
      result = true; 
     } 
     return result; 
    } // end check 

    public abstract Operand execute(Operand opd1, Operand opd2); 

} // end Operator 

어떤 도움이나 설명이 깊은 감사하겠습니다. 감사합니다.

+0

"키를 감안할 때 맵에서 해당 값을 얻으려면 어떻게해야합니까?"라고 묻는 중입니까? – immibis

답변

1

여러 가지 ...

1) HashMap 클래스는 일반적이며이 좀 더 쉽게 사용할 수 있도록 유형 매개 변수를 수행 할 수 있습니다 HashMap<String, Operator>.

2) check 메서드를 호출 할 때마다 해시도에 Operator의 새 인스턴스를 추가합니다. 이러한 인스턴스는 단순히 이전 인스턴스를 덮어 씁니다. 그러나 이는 의도 한 동작이 아닙니다. 해시 맵 (모두 operators.put 문)의 초기화는 static initializer에 발생해야합니다. 그렇게하면 한 번만 발생합니다.

3) 실제로는 긴 주석 ("Here I Check ...")이있는 지점에서 해시 맵에서 Operator을 검색해야합니다. 어떻게 그럴 수 있습니까? 음, operators지도는 패키지 전용이므로, 잠재적으로는 Operator.operators.get을 직접 사용할 수는 있지만 의도하지는 않습니다. 난 당신이 Operator 클래스에 별도의 정적 getter 메소드, 같은 싶은 생각 : 그와

abstract class Operator { 
    ... 
    static Operator get(String token) { 
     return operators.get(token); 
    } 
    ... 
} 

을, 당신은 단지 oprStack.push(Operator.get(tok)); 같은 호출하여 스택에 Operator를 밀어 할 수 있어야한다.

+0

데이브 감사합니다! 그것은 많은 도움이되었습니다. 나는 지금 그것을 얻는다라고 생각한다. –

+0

문제 없습니다. 다행히 도울 수있어. – Dave

관련 문제