在Java中如何确定令牌类型?

在Java中如何确定令牌类型?,java,stack,token,stringtokenizer,Java,Stack,Token,Stringtokenizer,我正在尝试使用StringTokenizer并用字符串输入中的元素填充2个堆栈。我试图使用嵌入while循环中的两个if循环将正确类型的令牌填充到它们各自的堆栈中。我正在努力研究如何实际设置条件来确定类型。这是我到目前为止所拥有的 Stack numbers = new Stack(); Stack operators = new Stack(); StringTokenizer token = new StringTokenizer(expr, delimiters, true);

我正在尝试使用StringTokenizer并用字符串输入中的元素填充2个堆栈。我试图使用嵌入while循环中的两个if循环将正确类型的令牌填充到它们各自的堆栈中。我正在努力研究如何实际设置条件来确定类型。这是我到目前为止所拥有的

 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()

下一个问题是,在第一个条件中比较的令牌与在第二个条件中比较的令牌不同
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?
    }
 }
List operators=Arrays.asList(“+”、“-”、“*”、“/”);
StringTokenizer令牌=。。。;
while(token.hasMoreTokens()){
字符串next=token.nextElement();
if(运算符.包含(下一个)){
//接线员
}
else if(next.matches(\\d+)){
//数
}
否则{
//错误?
}
}
首先,应该为下一个令牌使用一个变量,nextElement()还将从令牌化器中删除该令牌,因此必须将其保留在某个位置。然后我们可以通过比较字符串来确定类型,这里我检查它是否是预定运算符列表的一部分,以及它是否匹配regex
\d+
,即它是否是一个数字

贬低 该公司表示,它已被弃用,取而代之的是:

StringTokenizer是为兼容而保留的遗留类 原因,尽管新代码不鼓励使用它。建议这样做 任何寻求此功能的人都可以使用String的split方法 或者改为java.util.regex包


所以我建议不要使用这个类。

1。不要在while循环体中多次调用token.nextElement()。2.阅读不要使用
==
来比较字符串,请使用
.equals(其他对象)
来代替,因为您似乎是这个网站的新手,我会告诉您。基本上,您必须单击bast答案旁边的绿色复选标记,将您的问题标记为已解决,以奖励回答者。这是解决从左到右输入的数学表达式的算法的一部分(忽略通常的操作顺序)。谢谢你的回复,我想标记器只是生成了编译器认为的类型(即,如果他们看到3,则假定为int)。谢谢你的回答!