2017-03-05 32 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

这是解决从左到右输入的数学表达式(忽略通常的操作顺序)的算法的一部分。谢谢您的回复 –

相关问题