If the original string contains supplementary Unicode characters, then split()
would not work, as it splits these characters into surrogate pairs. To correctly handle these special characters, a code like this works:
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);
}
for(int i=0;i<str.length();i++)
{
System.out.println(str.charAt(i));
}
If characters beyond Basic Multilingual Plane are expected on input (some CJK characters, new emoji...), approaches such as "ab".split("(?!^)")
cannot be used, because they break such characters (results into array ["a", "?", "?", "b"]
) and something safer has to be used:
"ab".codePoints()
.mapToObj(cp -> new String(Character.toChars(cp)))
.toArray(size -> new String[size]);
String str = "cat";
char[] cArray = str.toCharArray();
"cat".toCharArray()
But if you need strings
"cat".split("")
Edit: which will return an empty first value.
Maybe you can use a for loop that goes through the String content and extract characters by characters using the charAt
method.
Combined with an ArrayList<String>
for example you can get your array of individual characters.
split("(?!^)")
does not work correctly if the string contains surrogate pairs. You should use split("(?<=.)")
.
String[] splitted = "?ab".split("(?<=.)");
System.out.println(Arrays.toString(splitted));
output:
[?, a, b, , , ]
An efficient way of turning a String into an array of one-character Strings would be to do this:
String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
res[i] = Character.toString(str.charAt(i));
}
However, this does not take account of the fact that a char
in a String
could actually represent half of a Unicode code-point. (If the code-point is not in the BMP.) To deal with that you need to iterate through the code points ... which is more complicated.
This approach will be faster than using String.split(/* clever regex*/)
, and it will probably be faster than using Java 8+ streams. It is probable faster than this:
String[] res = new String[str.length()];
int 0 = 0;
for (char ch: str.toCharArray[]) {
res[i++] = Character.toString(ch);
}
because toCharArray
has to copy the characters to a new array.
To sum up the other answers...
This works on all Java versions:
"cat".split("(?!^)")
This only works on Java 8 and up:
"cat".split("")
Source: Stackoverflow.com