Guia rápido para o Java StringTokenizer

Guia rápido para o Java StringTokenizer

*1. Visão geral *

Neste artigo rápido, exploraremos uma classe fundamental em Java - o* _https://docs.oracle.com/javase/8/docs/api/java/util/StringTokenizer.html [StringTokenizer] _ *.

*2. StringTokenizer *

*A classe _StringTokenizer_ nos ajuda a dividir _Strings_ em vários tokens.*

StreamTokenizer fornece funcionalidade semelhante, mas o método de tokenização é muito mais simples que o usado pelos https://docs. oracle.com/javase/8/docs/api/java/io/StreamTokenizer.html[StreamTokenizer]. Os métodos de StringTokenizer não distinguem entre identificadores, números e seqüências de caracteres citadas, nem reconhecem e ignoram comentários.

O conjunto de delimitadores (os caracteres que separam os tokens) pode ser especificado no momento da criação ou por token.

*3. Usando o StringTokenizer *

O exemplo mais simples de usar StringTokenizer será dividir um String com base nos delimitadores especificados.

Neste exemplo rápido, vamos dividir o argumento String e adicionar os tokens em uma lista : * + *

public List<String> getTokens(String str) {
    List<String> tokens = new ArrayList<>();
    StringTokenizer tokenizer = new StringTokenizer(str, ",");
    while (tokenizer.hasMoreElements()) {
        tokens.add(tokenizer.nextToken());
    }
    return tokens;
}

Observe como estamos dividindo o String na lista de tokens com base no delimitador ‘, _‘. Em seguida, no loop, usando _tokens.add () _ method; estamos adicionando cada token ao _ArrayList.

Por exemplo, se um usuário fornecer como "Welcome, para, .com", esse método retornará uma lista contendo um fragmento de três palavras como "Welcome", "to" e ".com".

====* 3.1 Abordagem Java 8 *

Como StringTokenizer implementa a interface Enumeration <Object> _, podemos usá-lo com a interface _Collections de Java_.

Se considerarmos o exemplo anterior, podemos recuperar o mesmo conjunto de tokens usando o método Collections.list () _ e a API _Stream:

public List<String> getTokensWithCollection(String str) {
    return Collections.list(new StringTokenizer(str, ",")).stream()
      .map(token -> (String) token)
      .collect(Collectors.toList());
}

Aqui, estamos passando o StringTokenizer como um parâmetro no método _Collections.list () _.

*A observação aqui é que, como a _Enumeração_ é do tipo _Objeto_, precisamos converter os tokens para o tipo _String_ do tipo* (ou seja, depende da implementação; se usarmos a _List_ de _Integer/Float_, precisaremos converter o tipo com _Integer/Float_).

3.2 Variantes de StringTokenizer

StringTokenizer vem com dois construtores sobrecarregados ao lado do construtor padrão: _StringTokenizer (String str) _ e _StringTokenizer (String str, delim de String, returnDelims booleano): _

*_StringTokenizer (String str, delim de String, returnDelims booleano) _* recebe uma entrada _boolean_ extra. Se o valor _boolean_ for _true_, _StringTokenizer_ considera o próprio delimitador como um token e o adiciona ao seu pool interno de tokens.
*_StringTokenizer (String_ str)* é um atalho para o exemplo anterior; chama internamente o outro construtor com delimitador codificado como _ ”\ t \ n \ r \ f” _ e o valor booleano como _false._

3.3 Personalização de token

StringTokenizer também vem com um método nextToken () _ sobrecarregado, que recebe um fragmento de string como entrada. Esse fragmento _String atua como um conjunto extra de delimitadores; com base em quais tokens são reorganizados novamente.

Por exemplo, se podemos passar e e ‘no método nextToken () _ para quebrar ainda mais a cadeia de caracteres com base no delimitador‘ _e ‘:

tokens.add(tokenizer.nextToken("e"));

Portanto, para uma determinada sequência de H Hello, .com ‘, produziremos os seguintes tokens:

H
llo
ba
ldung.com

3.4 Comprimento do token

Para contar os números disponíveis de tokens, podemos usar o método StringTokenizer‘s size:

int tokenLength = tokens.size();

3.5 Lendo do arquivo CSV

Agora, vamos tentar usar StringTokenizer em um caso de uso real.

Existem cenários em que tentamos ler dados de arquivos CSV e analisar os dados com base no delimitador fornecido pelo usuário.

Usando StringTokenizer, podemos facilmente chegar lá:

public List<String> getTokensFromFile( String path , String delim ) {
    List<String> 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;
}

Aqui, a função usa dois argumentos; um como nome de arquivo CSV (ou seja, leia da pasta resources [[src → main → resources] _) e a outra como um delimitador.

Com base nesses dois argumentos, os dados do CSV são lidos linha por linha e cada linha é tokenizada usando StringTokenizer.

Por exemplo, colocamos o seguinte conteúdo no CSV:

1|IND|India
2|MY|Malaysia
3|AU|Australia

Portanto, os seguintes tokens devem ser gerados:

1
IND
India
2
MY
Malaysia
3
AU
Australia

3.6 Teste

Agora, vamos criar um caso de teste rápido:

public class TokenizerTest {

    private MyTokenizer myTokenizer = new MyTokenizer();
    private List<String> expectedTokensForString = Arrays.asList(
      "Welcome" , "to" , ".com" );
    private List<String> expectedTokensForFile = Arrays.asList(
      "1" , "IND" , "India" ,
      "2" , "MY" , "Malaysia" ,
      "3", "AU" , "Australia" );

    @Test
    public void givenString_thenGetListOfString() {
        String str = "Welcome,to,.com";
        List<String> actualTokens = myTokenizer.getTokens( str );

        assertEquals( expectedTokensForString, actualTokens );
    }

    @Test
    public void givenFile_thenGetListOfString() {
        List<String> actualTokens = myTokenizer.getTokensFromFile(
          "data.csv", "|" );

        assertEquals( expectedTokensForFile , actualTokens );
    }
}

4. Conclusão

Neste tutorial rápido, vimos alguns exemplos práticos de uso do principal Java StringTokenizer.

Como sempre, o código fonte completo está disponível over no GitHub.