Así que lo sé String#codePointAt(int)
, pero está indexado por el char
desplazamiento, no por el desplazamiento del punto de código.
Estoy pensando en probar algo como:
- usando
String#charAt(int)
para obtenerchar
un índice - probando si
char
está en el rango de altos sustitutos- si es así, use
String#codePointAt(int)
para obtener el punto de código e incremente el índice en 2 - si no, use el
char
valor dado como punto de código e incremente el índice en 1
- si es así, use
Pero mis preocupaciones son
- No estoy seguro de si los puntos de código que están naturalmente en el rango de altos sustitutos se almacenarán como dos
char
valores o uno - esto parece una forma terriblemente cara de iterar a través de los personajes
- alguien debe haber ideado algo mejor.
offset = s.offsetByCodePoints(offset, 1);
. ¿Hay algún beneficio en usar en suoffset += Character.charCount(codepoint);
lugar?charAt()
que es una mala ideaJava 8 agregado
CharSequence#codePoints
que devuelve un queIntStream
contiene los puntos de código. Puede usar la secuencia directamente para iterar sobre ellos:o con un bucle for mediante la recopilación de la secuencia en una matriz:
Estas formas son probablemente más caras que la solución de Jonathan Feinbergs , pero son más rápidas de leer / escribir y la diferencia de rendimiento normalmente será insignificante.
fuente
for (int c : (Iterable<Integer>) () -> string.codePoints().iterator())
también funciona.for (int c : (Iterable<Integer>) string.codePoints()::iterator) ...
La iteración sobre puntos de código se archiva como una solicitud de función en Sun.
Ver entrada de insectos solares
También hay un ejemplo sobre cómo iterar sobre String CodePoints allí.
fuente
Pensé que agregaría un método de solución que funcione con bucles foreach ( ref ), además de que puede convertirlo al nuevo método String # codePoints de java 8 fácilmente cuando se cambia a java 8:
Puedes usarlo con foreach así:
Aquí está el método de ayuda:
O alternativamente, si solo desea convertir una cadena en una matriz de int (que podría usar más RAM que el enfoque anterior):
Afortunadamente, usa "codePoints" maneja de manera segura la pareja sustituta de UTF-16 (representación de cadena interna de Java).
fuente