2015-02-07 27 views
0

我必須創建一個程序來模擬計算器。我們必須在Operator類中使用HashMap,但我不知道如何去做這件事。我理解它的基本邏輯是。我們發送程序一個簡單的表達式,如1 + 2-3 * 4/5。然後程序將把它分成兩堆。一個帶有運算符,另一個帶有操作數。在分割字符時,我們必須檢查運算符的散列表,然後將它推送到堆棧,這就是我卡住的地方。如何/在哪裏放置/使用散列圖?我的代碼如下:Java - 如何使用散列表映射簡單的數學運算符

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

您是在問「給定關鍵字,我如何從Map獲取相應的值?」? – immibis 2015-02-07 04:06:12

回答

1

幾件事情......

1)HashMap類是通用的,可以採取類型參數,使其更容易一點使用方法:HashMap<String, Operator>

2)每次調用check方法時,都會在散列圖中添加Operator的新實例。這些實例只是覆蓋舊的實例,但這不是你想要的行爲。哈希映射(所有operators.put語句)的初始化應發生在static initializer中。那樣,它只發生一次。

3)您需要從哈希映射中檢索Operator,此時您的真正長時間評論(「此處我檢查...」)當前是。這怎麼可能發生?那麼,operators地圖只是封裝私人,所以你可能直接使用Operator.operators.get,但我會想象,這不是打算。我相信你想在Operator類單獨的靜態getter方法,是這樣的:

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

有了這一點,你就應該能夠到Operator與像oprStack.push(Operator.get(tok));呼叫推送到你的籌碼。

+0

謝謝戴夫!這有很大幫助。我想我現在明白了。 – 2015-02-07 22:54:45

+0

沒問題。很高興我能幫上忙。 – Dave 2015-02-08 04:36:20