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

时间:2017-03-05 18:37:57

标签: java stack token stringtokenizer

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

passwordField.setOnAction(e -> {
    if (/* check password... */ {
        textArea.requestFocus();
    }
});

2 个答案:

答案 0 :(得分:0)

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

下一个问题是您在第一个条件中比较的令牌不是2个条件中的令牌。 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(...){

   }
}

答案 1 :(得分: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()还会从Tokenizer中删除标记,因此您必须将其保留在某处。然后我们可以通过比较String来确定类型,在这里我检查它是否是预定运算符列表的一部分以及它是否与正则表达式\d+匹配,即。是否是一个数字。

弃用

StringTokenizer JavaDoc表示已弃用String.split

  

StringTokenizer是为保持兼容性而保留的旧类   原因虽然在新代码中不鼓励使用它。建议   任何寻求此功能的人都使用String的split方法   或者改为java.util.regex包。

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