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.