Eu sei String#codePointAt(int)
, mas é indexado pelo char
deslocamento, não pelo deslocamento do ponto de código.
Estou pensando em tentar algo como:
- usando
String#charAt(int)
para obter ochar
em um índice - testando se o
char
está na faixa de substitutos elevados- em caso afirmativo, use
String#codePointAt(int)
para obter o ponto de código e incremente o índice em 2 - caso contrário, use o
char
valor fornecido como ponto de código e aumente o índice em 1
- em caso afirmativo, use
Mas minhas preocupações são
- Não tenho certeza se os pontos de código que estão naturalmente na faixa de substitutos elevados serão armazenados como dois
char
valores ou um - esta parece uma maneira terrivelmente cara de iterar pelos personagens
- alguém deve ter inventado algo melhor.
offset = s.offsetByCodePoints(offset, 1);
. Existe algum benefício em usar emoffset += Character.charCount(codepoint);
vez disso?charAt()
que é uma má ideiaJava 8 adicionado,
CharSequence#codePoints
que retorna umIntStream
contendo os pontos de código. Você pode usar o stream diretamente para iterar sobre eles:ou com um loop for coletando o stream em uma matriz:
Essas formas são provavelmente mais caras do que a solução de Jonathan Feinbergs , mas são mais rápidas de ler / gravar e a diferença de desempenho geralmente será insignificante.
fonte
for (int c : (Iterable<Integer>) () -> string.codePoints().iterator())
também funciona.for (int c : (Iterable<Integer>) string.codePoints()::iterator) ...
A iteração de pontos de código é registrada como uma solicitação de recurso na Sun.
Veja a entrada do Sun Bug
Também há um exemplo de como iterar em String CodePoints.
fonte
Pensei em adicionar um método de solução alternativa que funcione com loops foreach ( ref ), além de poder convertê-lo para o novo método String # codePoints do java 8 facilmente ao mudar para o java 8:
Você pode usá-lo com foreach assim:
Aqui está o método auxiliar:
Ou, alternativamente, se você quiser apenas converter uma string em uma matriz de int (que pode usar mais RAM do que a abordagem acima):
Felizmente, usa "codePoints" para lidar com o par substituto do UTF-16 (representação de string interna do java).
fonte