Краткое руководство по Java StringTokenizer
1. обзор
В этой быстрой статье мы рассмотрим фундаментальный класс Java -StringTokenizer.
2. StringTokenizerс
КлассStringTokenizer помогает нам разбитьStrings на несколько токенов.
StreamTokenizer обеспечивает аналогичную функциональность, но метод токенизации намного проще, чем тот, который используется классомStreamTokenizer. МетодыStringTokenizer не различают идентификаторы, числа и строки в кавычках, а также не распознают и не пропускают комментарии.
Набор разделителей (символов, разделяющих токены) может быть указан либо во время создания, либо для каждого токена.
3. ИспользуяStringTokenizer
Простейшим примером использованияStringTokenizer будет разделениеString на основе указанных разделителей.
В этом быстром примере мы разделим аргумент String и добавим токены в список: **
public List getTokens(String str) {
List tokens = new ArrayList<>();
StringTokenizer tokenizer = new StringTokenizer(str, ",");
while (tokenizer.hasMoreElements()) {
tokens.add(tokenizer.nextToken());
}
return tokens;
}
Обратите внимание, как мы разбиваемString на список токенов на основе разделителя «,». Затем в цикле, используя методtokens.add(); мы добавляем каждый токен вArrayList.
Например, если пользователь вводит ввод как «Welcome,to,example.com», этот метод должен вернуть список, содержащий фрагмент из трех слов как «Welcome», «to» и «example.com) s «.
3.1. Подход Java 8
ПосколькуStringTokenizer реализует интерфейсEnumeration<Object>, мы можем использовать его с интерфейсом Java ’sCollections.
Если мы рассмотрим предыдущий пример, мы можем получить тот же набор токенов, используя методCollections.list() и APIStream:
public List getTokensWithCollection(String str) {
return Collections.list(new StringTokenizer(str, ",")).stream()
.map(token -> (String) token)
.collect(Collectors.toList());
}
Здесь мы передаемStringTokenizer как параметр в методеCollections.list().
Point to note here is that, since the Enumeration is an Object type, we need to type-cast the tokens to String type (т.е. зависит от реализации; если мы используемList изInteger/Float, тогда нам нужно будет выполнить приведение типов с помощьюInteger/Float).
3.2. ВариантыStringTokenizer
StringTokenizer поставляется с двумя перегруженными конструкторами рядом с конструктором по умолчанию:StringTokenizer(String str) иStringTokenizer(String str, String delim, boolean returnDelims):
StringTokenizer(String str, String delim, boolean returnDelims) принимает дополнительный вводboolean. Если значениеboolean равноtrue, тоStringTokenizer рассматривает сам разделитель как токен и добавляет его в свой внутренний пул токенов.
StringTokenizer(String str) - это ярлык для предыдущего примера; он внутренне вызывает другой конструктор с жестко заданным разделителем как” ” и логическим значением какfalse.
3.3. Настройка токена
StringTokenizer также поставляется с перегруженным методомnextToken(), который принимает на входе фрагмент строки. Этот фрагментString действует как дополнительный набор разделителей; на основании того, какие токены снова реорганизуются.
Например, если мы можем передать «e» в методеnextToken() для дальнейшего разбиения строки на основе разделителя «e»:
tokens.add(tokenizer.nextToken("e"));
Следовательно, для данной строки «Hello,example.com» мы произведем следующие токены:
H
llo
ba
ldung.com
3.4. Длина токена
Чтобы подсчитать доступное количество токенов, мы можем использовать методStringTokenizer‘ssize:
int tokenLength = tokens.size();
3.5. Чтение из файла CSV
Теперь давайте попробуем использоватьStringTokenizer в реальном сценарии использования.
Существуют сценарии, в которых мы пытаемся считывать данные из файлов CSV и анализировать данные на основе заданного пользователем разделителя.
ИспользуяStringTokenizer, мы можем легко добраться туда:
public List getTokensFromFile( String path , String delim ) {
List tokens = new ArrayList<>();
String currLine = "";
StringTokenizer tokenizer;
try (BufferedReader br = new BufferedReader(
new InputStreamReader(Application.class.getResourceAsStream(
"/" + path )))) {
while (( currLine = br.readLine()) != null ) {
tokenizer = new StringTokenizer( currLine , delim );
while (tokenizer.hasMoreElements()) {
tokens.add(tokenizer.nextToken());
}
}
} catch (IOException e) {
e.printStackTrace();
}
return tokens;
}
Здесь функция принимает два аргумента; один как имя файла CSV (т.е. читать из папки ресурсов[src → main → resources]), а другой - в качестве разделителя.
На основе этих двух аргументов данные CSV считываются построчно, и каждая строка токенизируется с использованиемStringTokenizer.
Например, мы поместили в CSV следующий контент:
1|IND|India
2|MY|Malaysia
3|AU|Australia
Следовательно, должны быть сгенерированы следующие токены:
1
IND
India
2
MY
Malaysia
3
AU
Australia
3.6. тестирование
А теперь давайте создадим небольшой тестовый пример:
public class TokenizerTest {
private MyTokenizer myTokenizer = new MyTokenizer();
private List expectedTokensForString = Arrays.asList(
"Welcome" , "to" , "example.com" );
private List expectedTokensForFile = Arrays.asList(
"1" , "IND" , "India" ,
"2" , "MY" , "Malaysia" ,
"3", "AU" , "Australia" );
@Test
public void givenString_thenGetListOfString() {
String str = "Welcome,to,example.com";
List actualTokens = myTokenizer.getTokens( str );
assertEquals( expectedTokensForString, actualTokens );
}
@Test
public void givenFile_thenGetListOfString() {
List actualTokens = myTokenizer.getTokensFromFile(
"data.csv", "|" );
assertEquals( expectedTokensForFile , actualTokens );
}
}
4. Заключение
В этом кратком руководстве мы рассмотрели несколько практических примеров использования ядра JavaStringTokenizer.
Как всегда, доступен полный исходный кодover on GitHub.