Вопрос-ответ

What is the easiest/best/most correct way to iterate through the characters of a string in Java?

Какой самый простой / наилучший / корректный способ перебора символов строки в Java?

Вот несколько способов перебора символов строки в Java::


  1. Используя StringTokenizer?

  2. Преобразование String в char[] и повторение этого.

Какой самый простой / наилучший / корректный способ перебора символов строки в Java?

Переведено автоматически
Ответ 1

Я использую цикл for для перебора строки и использую charAt(), чтобы получить каждый символ для его проверки. Поскольку строка реализована с помощью массива, charAt() метод представляет собой операцию с постоянным временем.

String s = "...stuff...";

for (int i = 0; i < s.length(); i++){
char c = s.charAt(i);
//Process char
}

Это то, что я бы сделал. Мне это кажется самым простым.

Что касается корректности, я не верю, что здесь она существует. Все зависит от вашего личного стиля.

Ответ 2

Два варианта

for(int i = 0, n = s.length() ; i < n ; i++) { 
char c = s.charAt(i);
}

или

for(char c : s.toCharArray()) {
// process c
}

Первый, вероятно, быстрее, тогда второй, вероятно, более читабелен.

Ответ 3

Обратите внимание, что большинство других методов, описанных здесь, не работают, если вы имеете дело с символами за пределами BMP (базовая многоязычная плоскость Unicode), т.е. с кодовыми точками, которые находятся за пределами диапазона u0000-uFFFF. Это будет происходить редко, поскольку кодовые точки за пределами этого в основном назначены мертвым языкам. Но помимо этого есть несколько полезных символов, например, некоторые кодовые точки, используемые для математической записи, а некоторые используются для кодирования имен собственных в китайском языке.

В этом случае ваш код будет:

String str = "....";
int offset = 0, strLen = str.length();
while (offset < strLen) {
int curChar = str.codePointAt(offset);
offset += Character.charCount(curChar);
// do something with curChar
}

Для Character.charCount(int) метода требуется Java 5+.

Источник: http://mindprod.com/jgloss/codepoint.html

Ответ 4

В Java 8 мы можем решить это следующим образом:

String str = "xyz";
str.chars().forEachOrdered(i -> System.out.print((char)i));
str.codePoints().forEachOrdered(i -> System.out.print((char)i));

Метод chars() возвращает, IntStream как упомянуто в документе:


Возвращает поток значений int zero, расширяющий значения char из этой последовательности. Любой char, который соответствует суррогатной кодовой точке, передается без интерпретации. Если последовательность изменяется во время чтения потока, результат не определен.


Метод codePoints() также возвращает IntStream согласно документу:


Возвращает поток значений кодовых точек из этой последовательности. Любые суррогатные пары, встречающиеся в последовательности, объединяются как бы по символу.Укажите код, и результат будет передан в поток. Любые другие единицы кода, включая обычные символы BMP, непарные суррогаты и неопределенные единицы кода, расширяются до значений int, которые затем передаются в поток.


Чем отличаются символы char и code point? Как упоминалось в этой статье:


В Unicode 3.1 добавлены дополнительные символы, в результате чего общее количество символов превысило 2 ^ 16 = 65536 символов, которые можно отличить с помощью одного 16-битного char. Следовательно, значение char больше не имеет однозначного соответствия основной семантической единице в Unicode. JDK 5 был обновлен для поддержки большего набора символьных значений. Вместо изменения определения char типа некоторые из новых дополнительных символов представлены суррогатной парой из двух char значений. Чтобы уменьшить путаницу в именовании, кодовая точка будет использоваться для обозначения числа, представляющего конкретный символ Unicode, включая дополнительные.


Наконец , почему forEachOrdered а не forEach нет ?

Поведение forEach явно недетерминировано, где в качестве forEachOrdered выполняет действие для каждого элемента этого потока в порядке встреч потока, если поток имеет определенный порядок встреч. So forEach не гарантирует, что порядок будет сохранен. Также проверьте этот вопрос, чтобы узнать больше.

Чтобы узнать разницу между символом, кодовой точкой, глифом и графемой, проверьте этот вопрос.

java string