我正在尝试使用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软件包。
所以我建议不要使用此类。