簡體   English   中英

為什么我不能訪問從Java的StringTokenizer返回的第一個令牌?

[英]Why can't I access the first token returned from Java's StringTokenizer?

我正在使用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)等)。 訪問String中的第一個物理標記需要做什么?

您的代碼不反映輸出,但是當您想要訪問任意令牌時,無論如何您可能希望使用String.split()函數而不是tokenizer,例如:

    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”,第一個令牌。

您在循環中覆蓋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);
    }
  }
}

這里的問題是你打印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);
   }

你的while循環遍歷所有標記,我認為這是一個錯位的}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM