Мне нужно разбить строку на массив односимвольных строк.
Например, разделение «кот» даст массив «c», «a», «t»
.split("")
сделает это.
Мне нужно разбить строку на массив односимвольных строк.
Например, разделение «кот» даст массив «c», «a», «t»
.split("")
сделает это.
Ответы:
"cat".split("(?!^)")
Это произведет
array ["c", "a", "t"]
(?!
... )
- это синтаксис регулярного выражения для отрицательного утверждения - он утверждает, что нет совпадения с тем, что внутри него. И ^
соответствует началу строки, поэтому регулярное выражение соответствует каждой позиции, которая не является началом строки, и вставляет туда разделение. Это регулярное выражение также совпадает с концом строки и, таким образом, также добавит к результату пустую строку, за исключением того, что в String.split
документации сказано, что «завершающие пустые строки не включаются в результирующий массив».
String.split
было немного изменено, так что ведущие пустые строки, созданные сопоставлением нулевой ширины, также не включаются в массив результатов, поэтому (?!^)
утверждение о том, что позиция не является началом строки, становится ненужным, что позволяет регулярному выражению быть упрощенным до нуля - "cat".split("")
но в Java 7 и ниже это создает пустую строку в начале массива результатов.
"cat".toCharArray()
Но если вам нужны струны
"cat".split("")
Изменить: который вернет пустое первое значение.
.toCharArray()
; он избегает регулярных выражений и возвращает массив char
примитивов, поэтому он работает быстрее и легче. Странно нуждаться в массиве строк из 1 символа .
String str = "cat";
char[] cArray = str.toCharArray();
cArray
обратно в String
?
Если при вводе ожидаются символы, выходящие за рамки Basic Multilingual Plane (некоторые символы CJK, новые смайлы ...), такие подходы, как "a💫b".split("(?!^)")
нельзя использовать, потому что они разбивают такие символы (приводит к array ["a", "?", "?", "b"]
), и необходимо использовать что-то более безопасное:
"a💫b".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
Эффективным способом преобразования String в массив односимвольных строк было бы следующее:
String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
res[i] = Character.toString(str.charAt(i));
}
Однако при этом не учитывается тот факт, что a char
в a String
может фактически представлять половину кодовой точки Unicode. (Если кодовая точка отсутствует в BMP.) Чтобы справиться с этим, вам нужно перебирать кодовые точки ... что более сложно.
Этот подход будет быстрее, чем использование String.split(/* clever regex*/)
, и, вероятно, будет быстрее, чем использование потоков Java 8+. Вероятно, быстрее, чем это:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
потому toCharArray
что необходимо скопировать символы в новый массив.
Возможно, вы можете использовать цикл for, который просматривает содержимое String и извлекает символы по символам с помощью charAt
метода.
В сочетании с, ArrayList<String>
например, вы можете получить массив отдельных символов.
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}
Если исходная строка содержит дополнительные символы Unicode , split()
это не сработает, поскольку она разбивает эти символы на суррогатные пары. Чтобы правильно обрабатывать эти специальные символы, работает следующий код:
String[] chars = new String[stringToSplit.codePointCount(0, stringToSplit.length())];
for (int i = 0, j = 0; i < stringToSplit.length(); j++) {
int cp = stringToSplit.codePointAt(i);
char c[] = Character.toChars(cp);
chars[j] = new String(c);
i += Character.charCount(cp);
}
Оператор распространения [ ...
] создает массив с каждым символом в строке:
const cat= 'cat';
const arrayized = [...cat] // ['c', 'a', 't'];
console.log(arrayized);