Donc, je sais String#codePointAt(int)
, mais il est indexé par le char
décalage, pas par le décalage du point de code.
Je pense essayer quelque chose comme:
- utilisation
String#charAt(int)
pour obtenirchar
un index - tester si le
char
est dans la gamme des substituts élevés- si c'est le cas, utilisez
String#codePointAt(int)
pour obtenir le point de code et incrémentez l'index de 2 - sinon, utilisez la
char
valeur donnée comme point de code et incrémentez l'index de 1
- si c'est le cas, utilisez
Mais mes inquiétudes sont
- Je ne sais pas si les points de code qui sont naturellement dans la plage des substituts élevés seront stockés sous forme de deux
char
valeurs ou une - cela semble être un moyen extrêmement coûteux d'itérer les personnages
- quelqu'un a dû trouver quelque chose de mieux.
offset = s.offsetByCodePoints(offset, 1);
. Y a-t-il un avantage à utiliser à laoffset += Character.charCount(codepoint);
place?charAt()
ce qui est une mauvaise idéeJava 8 ajouté
CharSequence#codePoints
qui renvoie unIntStream
contenant les points de code. Vous pouvez utiliser le flux directement pour les parcourir:ou avec une boucle for en collectant le flux dans un tableau:
Ces moyens sont probablement plus chers que la solution de Jonathan Feinbergs , mais ils sont plus rapides à lire / écrire et la différence de performances sera généralement insignifiante.
la source
for (int c : (Iterable<Integer>) () -> string.codePoints().iterator())
fonctionne également.for (int c : (Iterable<Integer>) string.codePoints()::iterator) ...
L'itération sur les points de code est déposée en tant que demande de fonctionnalité chez Sun.
Voir Sun Bug Entry
Il existe également un exemple sur la façon d'itérer sur des String CodePoints.
la source
Je pensais que j'ajouterais une méthode de contournement qui fonctionne avec les boucles foreach ( ref ), plus vous pouvez la convertir en la nouvelle chaîne # codePoints de java 8 facilement en méthode de java 8 lorsque vous passez à java 8:
Vous pouvez l'utiliser avec foreach comme ceci:
Voici le mthod d'aide:
Ou bien si vous souhaitez simplement convertir une chaîne en un tableau d'int (qui peut utiliser plus de RAM que l'approche ci-dessus):
Utilise heureusement "codePoints" gère en toute sécurité la paire de substitution de UTF-16 (représentation de chaîne interne de Java).
la source