Zacznijmy od wyeliminowania StringTokenizer. Starzeje się i nie obsługuje nawet wyrażeń regularnych. Jego dokumentacja stwierdza:
StringTokenizerjest starszą klasą, która jest zachowywana ze względu na kompatybilność, chociaż jej użycie jest odradzane w nowym kodzie. Zaleca się, aby każdy, kto szuka tej funkcji, używał splitmetody Stringlub java.util.regexpakietu.
Więc wyrzućmy to od razu. To pozostawia split()i Scanner. Jaka jest między nimi różnica?
Po pierwsze, split()po prostu zwraca tablicę, co ułatwia korzystanie z pętli foreach:
for (String token : input.split("\\s+") { ... }
Scanner jest zbudowany bardziej jak strumień:
while (myScanner.hasNext()) {
String token = myScanner.next();
...
}
lub
while (myScanner.hasNextDouble()) {
double token = myScanner.nextDouble();
...
}
(Ma dość duże API , więc nie myśl, że zawsze ogranicza się do tak prostych rzeczy).
Ten interfejs w stylu strumieniowym może być przydatny do analizowania prostych plików tekstowych lub danych wejściowych konsoli, gdy nie masz (lub nie możesz uzyskać) wszystkich danych wejściowych przed rozpoczęciem analizowania.
Osobiście pamiętam tylko jeden raz, kiedy korzystałem Scannerz projektów szkolnych, kiedy musiałem uzyskać dane wejściowe użytkownika z wiersza poleceń. To sprawia, że tego rodzaju operacja jest łatwa. Ale jeśli mam coś String, z czym chcę się rozstać, to prawie nie ma sensu split().