Краткое руководство по Java StringTokenizer

Краткое руководство по 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.