Почему я не могу получить доступ к первому токену, возвращенному из 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);
}