【问题标题】:How do you determine token type in Java?如何确定 Java 中的令牌类型?
【发布时间】:2017-03-05 18:37:56
【问题描述】:

我正在尝试使用 StringTokenizer 并使用 String 输入中的元素填充 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() == ){

   }
 }

【问题讨论】:

  • 1.不要在 while 循环体中多次调用 token.nextElement()。 2.阅读stackoverflow.com/questions/513832/…
  • 不要使用==比较字符串,而是使用.equals(otherObject)
  • 由于您似乎是这个网站的新手,我会为您指点this help page。您基本上必须单击 bast 答案旁边的绿色复选标记以将您的问题标记为已解决并奖励回答者。

标签: java stack token stringtokenizer


【解决方案1】:

首先,您不应该将 == 与字符串一起使用。请改用 .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(...){

   }
}

【讨论】:

  • 好吧,我认为标记器只是将类型设置为编译器认为的任何类型(即,如果他们看到 3,他们会假设为 int)。谢谢你的回答!
【解决方案2】:

答案

返回的标记实际上是字符串,所以你可以用它们做通常的事情。我不知道您的确切要求是什么,但这样的东西应该可以工作:

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 包。

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

【讨论】:

  • 这是解决从左到右输入的数学表达式的算法的一部分(忽略通常的操作顺序)。谢谢你的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-25
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
相关资源
最近更新 更多