Diferenças entre o tokenize() e o split() de uma String

Posted Almost 7 years ago. Visible to the public.

Split

  1. Aceita regex como parâmetro;
  2. Retorna String[];
  3. Quando não houver conteúdo entre os delimitadores retorna uma String vazia, ou seja, o Array sempre terá o tamanho igual a (quantidade de delimitadores + 1);

Tokenize

  1. Cada char do parâmetro token será considerado um delimitador;
  2. Retorna List<String>;
  3. Quando não houver conteúdo entre os delimitadores, não retorna nada, ou seja, a lista resultante pode ter tamanho variável.

Exemplos

A,B,C,,E,F,G
A,,C,,E,,G
,B,,D,E,F,

Tendo estas linhas como exemplo o tokenize(',') e o split(',') de cada linha executam de formas diferentes por conta dos conteúdos vazios. O split(',') mantém as posições dos elementos da string enquanto o tokenize(',') remove os conteúdos vazios. Que é o cenário do caso de dois delimitadores consecutivos (,,) entre alguns valores dos exemplos.

O resultado do split(',') das linhas individualmente seriam os seguintes vetores:

['A', 'B', 'C', '', 'E', 'F', 'G']
['A', '', 'C', '', 'E', '', 'G']
['', 'B', '', 'D', 'E', 'F', '']

Perceba que para o split() teremos neste exemplo nas posições [0] sempre o 'A' ou '' e nas posições [3] sempre o 'D' ou ''.

O resultado do tokenize(',') das linhas individualmente seriam as seguintes listas:

['A', 'B', 'C', 'E', 'F', 'G']
['A', 'C', 'E', 'G']
['B', 'D', 'E', 'F']

Perceba que para o tokenize() teremos neste exemplo nas posições [0] os valores variáveis 'A' ou 'B', e nas posições [3] os valores 'E' ou 'G' ou 'F'.

Assinatura diferenciada

Perceba no exemplo desta outra linha onde o split aceita ainda a informação de um limit de valores, parando de quebrar o texto após atingir o limite. (Informar 0 é o mesmo que sem limite).
Note a diferença entre informar 0 (ou sem limite) e informar -1.

String linha = 'A-B-C-D---'
assert linha.split('-') == ['A', 'B', 'C', 'D']
assert linha.split('-', 0) == ['A', 'B', 'C', 'D']
assert linha.split('-', 1) == ['A-B-C-D---']
assert linha.split('-', 2) == ['A', 'B-C-D---']
assert linha.split('-', 3) == ['A', 'B', 'C-D---']
assert linha.split('-', 4) == ['A', 'B', 'C', 'D---']
assert linha.split('-', 5) == ['A', 'B', 'C', 'D', '--']
assert linha.split('-', 6) == ['A', 'B', 'C', 'D', '', '-']
assert linha.split('-', -1) == ['A', 'B', 'C', 'D', '', '', '']

Conclusão

Portanto se você utilizar o tokenize() para tratar os retornos baseando-se em posições fixas, por conta desta remoção de valores em branco você pode atingir comportamentos inesperados. Então cuidado! Ou na dúvida utilize sempre o split().

lucascampos
Last edit
Over 6 years ago
João Paulo
Posted by lucascampos to ZeroGlosa (2017-07-20 20:33)