Я знаю String#codePointAt(int)
, но он индексируется по char
смещению, а не по смещению кодовой точки.
Я думаю попробовать что-то вроде:
- используя
String#charAt(int)
для полученияchar
индекса - тестирование,
char
находится ли в диапазоне высоких суррогатов- если это так, используйте
String#codePointAt(int)
для получения кодовой точки и увеличьте индекс на 2 - если нет, используйте данное
char
значение в качестве кодовой точки и увеличьте индекс на 1
- если это так, используйте
Но меня беспокоит
- Я не уверен, будут ли кодовые точки, которые естественно находятся в диапазоне высоких суррогатов, храниться как два
char
значения или одно - это кажется ужасно дорогим способом перебора символов
- кто-то, должно быть, придумал что-то получше.
offset = s.offsetByCodePoints(offset, 1);
. Есть ли польза от использованияoffset += Character.charCount(codepoint);
вместо этого?charAt()
плохой идеиДобавлена Java 8,
CharSequence#codePoints
которая возвращает объект,IntStream
содержащий кодовые точки. Вы можете использовать поток напрямую, чтобы перебирать их:или с помощью цикла for, собрав поток в массив:
Эти способы, вероятно, дороже, чем решение Джонатана Фейнбергса , но они быстрее читаются / записываются, и разница в производительности обычно незначительна.
источник
for (int c : (Iterable<Integer>) () -> string.codePoints().iterator())
тоже работает.for (int c : (Iterable<Integer>) string.codePoints()::iterator) ...
Итерация по кодовым точкам подается в Sun как запрос функции.
Видеть Запись об Sun
Там также есть пример того, как перебирать String CodePoints.
источник
Думал, что добавлю обходной метод, который работает с циклами foreach ( ref ), плюс вы можете преобразовать его в новый String # codePoints java 8 метод при переходе на java 8:
Вы можете использовать его с foreach следующим образом:
Вот вспомогательный метод:
Или, наоборот, если вы просто хотите преобразовать строку в массив int (который может использовать больше ОЗУ, чем описанный выше подход):
К счастью, использует «codePoints», безопасно обрабатывает суррогатную пару UTF-16 (внутреннее строковое представление Java).
источник