2017-03-05 44 views
0

我正在嘗試使用StringTokenizer並使用String輸入內的元素填充2個堆棧。我試圖使用嵌入在while循環中的兩個if循環將正確類型的標記填充到它們各自的堆棧中。我正在努力如何真正設置一個條件來確定類型。這是迄今爲止我所擁有的。如何確定Java中的令牌類型?

Stack numbers = new Stack(); 
Stack operators = new Stack(); 
StringTokenizer token = new StringTokenizer(expr, delimiters, true); 

while(token.hasMoreTokens()){ 
    if(token.nextElement() ==){ 

    } 
    if(token.nextElement() ==){ 

    } 
} 
+0

1.不要在while循環體中多次調用token.nextElement()。 2.閱讀http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java –

+0

不要用==來比較字符串,而是使用'.equals(otherObject)'而不是 –

+0

由於它看起來像你是這個網站的新手,我會指出你[這個幫助頁面](http://stackoverflow.com/help/someone-answers)。您基本上必須點擊韌皮答案旁邊的綠色複選標記,將您的問題標記爲已解決,以獎勵回答者。 –

回答

0

首先,你不應該對字符串使用==。請改用.equals()。

下一個問題是您在第一個條件下比較的令牌與第二個條件中的令牌不同。 token.nextToken()返回第一個標記並從Tokenizer中刪除它。

您可以創建一個臨時變量來存儲第一個元素。然後你可以使用這個來比較它。

Stack numbers = new Stack(); 
Stack operators = new Stack(); 
StringTokenizer token = new StringTokenizer(expr, delimiters, true); 

while(token.hasMoreTokens()) { 
    String tmp = token.nextElement() 
    if(tmp.equals(...)){ 

    } 
    if(tmp.equals(...){ 

    } 
} 
+0

沒關係,我認爲tokenizer只是做了什麼編譯器認爲它是類型(即,如果他們看到3,他們假設int)。謝謝您的回答! –

0

答案

返回的令牌實際上是字符串,這樣你就可以跟他們做平常的東西。我不知道您的具體要求是什麼,但這樣的事情應該工作:

List<String> operators = Arrays.asList("+", "-", "*", "/"); 
StringTokenizer token = ...; 

while(token.hasMoreTokens()){ 
    String next = token.nextElement(); 
    if(operators.contains(next)){ 
     //operator 
    } 
    else if(next.matches("\\d+")){ 
     //number 
    } 
    else { 
     //error? 
    } 
} 

首先,你應該使用一個使用可變下一個標記,nextElement()也將刪除標記生成器的令牌,以便你必須保持它的某個地方。然後我們可以通過比較String來確定類型,在這裏我檢查它是否是預定運算符列表的一部分,以及它是否匹配正則表達式\d+,即。無論是數字。

棄用

StringTokenizer JavaDoc表示,它已經支持String.split被棄用:

的StringTokenizer是保留兼容性 原因,雖然它的使用是在新代碼氣餒的遺留類。建議 任何尋求此功能的人都使用字符串 或java.util.regex包的拆分方法。

所以我會建議不要使用這個類。

+0

這是解決從左到右輸入的數學表達式(忽略通常的操作順序)的算法的一部分。謝謝您的回覆 –