您如何确定Java中的令牌类型



我正在尝试使用StringTokenizer并填充2个堆栈,其中有字符串输入中的元素。如果在一段时间内嵌入了循环,我会尝试使用两个,以将正确类型的令牌填充到各自的堆栈中。我为如何实际设置有条件确定类型而苦苦挣扎。这是我到目前为止所拥有的。

 Stack numbers = new Stack();
 Stack operators = new Stack();
 StringTokenizer token = new StringTokenizer(expr, delimiters, true);
 while(token.hasMoreTokens()){
   if(token.nextElement() == ){
   }
   if(token.nextElement() == ){
   }
 }

首先,您不应该在字符串中使用==。请使用.equals()代替。

下一个问题是您在第一个条件下比较的令牌是另一种情况,而不是2个条件中的一个条件。 token.nextToken()给出了第一个令牌,还将其从令牌中删除。

您可以制作一个存储第一个元素的临时变量。然后,您可以使用此方法将其与某物进行比较。

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(...){
   }
}

答案

返回的令牌实际上是字符串,因此您可以与它们一起做通常的事情。我不知道您的确切要求是什么,但是类似的东西应该起作用:

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?
    }
 }

首先,您应该使用一个用于近代令牌的变量,nextEllement()还从令牌中删除令牌,因此您必须将其保留在某个地方。然后,我们可以通过比较字符串来确定类型,在这里我检查它是否是预定运算符列表的一部分,以及它是否匹配Regex d+,即。是否是数字。

弃用

StringTokenizer Javadoc说它已被弃用以支持字符串。Split:

StringTokenizer是保留兼容性的旧类 尽管其使用在新代码中不建议使用。建议使用 寻求此功能的任何人都使用字符串的拆分方法 或java.util.regex软件包。

所以我建议不要使用此类。

相关内容

  • 没有找到相关文章

最新更新