Почему я не могу получить доступ к первому токену, возвращенному из Java 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 - второй физический токен. Я не видел firstToken() метод в документации Java, и я не видел способ назначить конкретные токены для конкретных переменных (например, String myToken = strTok.tokenNumber(0) так далее.). Что мне нужно сделать, чтобы получить доступ к первому физическому токену в моей строке?

4 ответа

Решение

Ваш код не отражает вывод, но в любом случае вы можете использовать String.split() функции вместо токенизатора, когда вы хотите получить доступ к произвольному токену, например:

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

распечатает "а", первый токен.

StringTokenizer класс разрешает доступ к токену только после токена, вы не можете получить доступ к токену произвольным способом. Но вы также можете использовать его для доступа к первому токену:

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

Также распечатает "а", первый жетон.

Вы перезаписываете значение 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);
    }
Другие вопросы по тегам