Первый конструктор, StringTokenizer(String str), создает объект, готовый разбить строку str на слова, разделенные пробелами, символами табуляции '\t', перевода строки '\n' и возврата каретки '\r'. Разделители не включаются в число слов.
Второй конструктор, StringTokenizer (String str, String delimeters), задает разделители вторым параметром delimeters, например:
StringTokenizer("Казнить,нельзя:пробелов-нет", " \t\n\r,:-");
Здесь первый разделитель — пробел. Потом идут символ табуляции, символ перевода строки, символ возврата каретки, запятая, двоеточие, дефис. Порядок расположения разделителей в строке delimeters не имеет значения. Разделители не включаются в число слов.
Третий конструктор позволяет включить разделители в число слов:
StringTokenizer(String str, String delimeters, boolean flag);
Если параметр flag равен true, то разделители включаются в число слов, если false — нет. Например:
StringTokenizer("a — (b + c) / b * c", " \t\n\r+*-/()", true);
В разборе строки на слова активно участвуют два метода:
□ метод nextToken () возвращает в виде строки следующее слово;
□ логический метод hasMoreTokens () возвращает true, если в строке еще есть слова, и false, если слов больше нет.
Третий метод, countTokens (), возвращает число оставшихся слов.
Четвертый метод, nextToken(String newDelimeters), позволяет "на ходу" менять разделители. Следующее слово будет выделено по новым разделителям newDelimeters; новые разделители действуют далее вместо старых разделителей, определенных в конструкторе или предыдущем методе nextToken ( ).
Оставшиеся два метода, nextElement () и hasMoreElements (), реализуют интерфейс
Enumeration. Они просто обращаются к методам nextToken () и hasMoreTokens ().
Схема разбора очень проста (листинг 5.2).
Листинг 5.2. Разбиение строки на слова
import java.util.*; class MyParser{
public static void main(String[] args){
String s = "Строка, которую мы хотим разобрать на слова"; StringTokenizer st = new StringTokenizer(s, " \t\n\r,.");
while(st.hasMoreTokens()){
// Получаем слово и что-нибудь делаем с ним, например // просто выводим на экран System.out.println(st.nextToken());
}
}
}
Полученные слова обычно заносятся в какой-нибудь класс-коллекцию: Vector, Stack или другой, наиболее подходящий для дальнейшей обработки текста контейнер. Классы-коллекции мы рассмотрим в следующей главе.
Заключение
Все методы представленных в этой главе классов написаны на языке Java. Их исходные тексты можно посмотреть, они входят в состав JDK. Это очень полезное занятие. Просмотрев исходный текст, вы получаете полное представление о том, как работает метод.
Исходные тексты хранятся в ZIP-архиве src.zip, лежащем в корневом каталоге JDK, например в каталоге D:\jdk1.7.0.
После распаковки в каталоге jdk1.7.0 появится подкаталог, например, src, а в нем — подкаталоги, соответствующие пакетам и подпакетам JDK, с исходными файлами.
Вопросы для самопроверки
1. Зачем в язык Java введено несколько классов, обрабатывающих строки символов?
2. Какова разница между классами String и StringBuilder?
3. Какова разница между классами StringBuffer и StringBuilder?
4. Что лучше использовать для сцепления строк: операцию сцепления или метод append() класса StringBuilder?
5. Что лучше использовать для разбора строки: метод split() или класс StringTokenizer?
ГЛАВА 6
В листинге 5.2 мы разобрали строку на слова. Как их сохранить для дальнейшей обработки?
До сих пор для таких целей мы пользовались массивами. Они удобны, если необходимо быстро обработать однотипные элементы, например просуммировать числа, найти наибольшее и наименьшее значение, отсортировать списки. Но уже для поиска нужных сведений в большом объеме информации массивы неудобны. Для этого лучше использовать другие разновидности хранения данных, например бинарные деревья поиска.
Кроме того, массивы всегда имеют постоянную, предварительно заданную длину, поэтому в массивы невозможно добавлять элементы без переопределения массивов. При удалении элемента из массива оставшиеся элементы следует перенумеровывать, чтобы сохранить их непрерывную нумерацию.
При решении задач, в которых количество элементов заранее неизвестно, а элементы надо часто удалять и добавлять, следует искать другие способы хранения.
Читать дальше
Конец ознакомительного отрывка
Купить книгу