【问题标题】:Why can't I access the first token returned from Java's StringTokenizer?为什么我不能访问从 Java 的 StringTokenizer 返回的第一个令牌?
【发布时间】:2013-10-04 14:10:04
【问题描述】:

我正在使用 Buffered Reader 将文件的各个行传递给 Java 的 StringTokenizer。文件结构如下:

"2,0";"foo";"foo.doc";"12345"
"2,4";"foo";"foo.doc";"34567";"foo7";"foo7.doc";"45678";"foo6";"foo6.doc";"56789";"foo5";"foo5.doc";"67890";"foo4";"foo4.doc";"23456"   
"3,0";"foo7";"foo7.doc";"34567"
"3,0";"foo6";"foo6.doc";"45678"
"3,0";"foo5";"foo5.doc";"56789"
"3,0";"foo4";"foo4.doc";"67890"

这是我正在使用的代码。

public class parse {
  public static void main(String args[]) {
    FileInputStream inputStream = new FileInputStream("whidata0.txt");
    BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); 
    while((scrubbedInput=br.readLine())!=null) {
      StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
      int tokens = strTok.countTokens();
      while (strTok.hasMoreTokens()) {
        tok01 = strTok.nextToken();
      }
      System.out.println("  scrubbed: " + scrubbedInput);
      System.out.println("    tokens: " + tokens);
      System.out.println("     tok01: " + tok01);
    }
  }
}

产生这个结果。

scrubbed: "2,0";"foo";"foo.doc";"12345" 
  tokens: 4
   tok01: 12345  scrubbed: "2,4";"foo";"foo.doc";"34567";"foo7";"foo7.doc";"45678";"foo6";"foo6.doc";"56789";"foo5";"foo5.doc";"67890";"foo4";"foo4.doc";"23456"    
  tokens: 16
   tok01: 23456
scrubbed: "3,0";"foo7";"foo7.doc";"34567"
  tokens: 4
   tok01: 34567
scrubbed: "3,0";"foo6";"foo6.doc";"45678"
  tokens: 4
   tok01: 45678
scrubbed: "3,0";"foo5";"foo5.doc";"56789"
  tokens: 4
   tok01: 56789
scrubbed: "3,0";"foo4";"foo4.doc";"67890"               
  tokens: 4
   tok01: 67890

当使用nextToken() 时,起始令牌应该是什么?似乎StringTokenizer 以令牌0 开头,因此nextToken() 实际上是令牌1——第二个物理令牌。我没有在 Java 文档中看到 firstToken() 方法,也没有看到将特定标记分配给特定变量的方法(例如,String myToken = strTok.tokenNumber(0) 等)。我需要做什么才能访问我的字符串中的第一个物理令牌?

【问题讨论】:

  • 此处的代码似乎不完整,也不是产生此输出的代码。例如对于此处显示的代码,第一个 "tok01: 12345" 应该是 tok01: "foo.doc"
  • 糟糕...剪切并粘贴了旧版本的测试文件...已在上面更新以反映我使用的正确文件。
  • 这似乎更合适。您的 while (strTok.hasMoreTokens()) tok01 = strTok.nextToken(); 循环将每行的最后一个标记分配给 tok01 - 这可能是也可能不是您打算做的事情。 strTok.nextToken() 但是在你第一次调用它时会给你第一个令牌

标签: java stringtokenizer


【解决方案1】:

您的代码不反映输出,但无论如何,当您想要访问任意令牌时,您可能希望使用String.split() 函数而不是标记器,例如:

    String st = "a;b;c";        
    String[] tokens = st.split(";");
    System.out.println(tokens[0]);

将打印出第一个标记“a”。

StringTokenizer 类只允许在一个令牌之后访问令牌,不能以随机访问方式访问令牌。但是您也可以使用它来访问第一个令牌:

    String st = "a;b;c";        
    StringTokenizer tokenizer = new StringTokenizer(st,";");
    System.out.println(tokenizer.nextToken());

还会打印出第一个标记“a”。

【讨论】:

    【解决方案2】:

    您在循环中覆盖 tokens 的值。

    试试这个,看看输出。

    public class parse {
      public static void main(String args[]) {
        FileInputStream inputStream = new FileInputStream("whidata0.txt");
        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream)); 
        while((scrubbedInput=br.readLine())!=null) {
          StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
          int tokens = strTok.countTokens();
          while (strTok.hasMoreTokens()) {
            tok01 = strTok.nextToken();
            System.out.println("     tok01: " + tok01);
          }
          System.out.println("  scrubbed: " + scrubbedInput);
          System.out.println("    tokens: " + tokens);
          System.out.println("last tok01: " + tok01);
        }
      }
    }
    

    【讨论】:

    • 这一点现在没有实际意义,因为 OP 没有显示正确的输入。如果您做出假设,请说明它们。
    【解决方案3】:

    这里的问题是你在 while 循环中打印了 System.out.println(" tok01: " + tok01);

      StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
      int tokens = strTok.countTokens();
      while (strTok.hasMoreTokens()) {
        tok01 = strTok.nextToken();// here is the problem
      }
      System.out.println("  scrubbed: " + scrubbedInput);
      System.out.println("    tokens: " + tokens);
      System.out.println("     tok01: " + tok01);
    

    我觉得应该像下面这样

       StringTokenizer strTok = new StringTokenizer(scrubbedInput, ";", false);
       int tokens = strTok.countTokens();
       System.out.println("  scrubbed: " + scrubbedInput);
       System.out.println("    tokens: " + tokens);
       while (strTok.hasMoreTokens()) {
           tok01 = strTok.nextToken();           
           System.out.println("     tok01: " + tok01);
       }
    

    【讨论】:

      【解决方案4】:

      您的 while 循环首先遍历所有标记,我认为这是一个放错位置的 }

          while (strTok.hasMoreTokens()) {
            tok01 = strTok.nextToken();                  
            System.out.println("     tok01: " + tok01);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        • 1970-01-01
        • 2020-09-21
        • 2015-06-26
        • 2011-02-13
        相关资源
        最近更新 更多