文字列を単一の文字列の配列に分割する必要があります。
たとえば、「cat」を分割すると、配列「c」、「a」、「t」が得られます
.split("")
やります。
文字列を単一の文字列の配列に分割する必要があります。
たとえば、「cat」を分割すると、配列「c」、「a」、「t」が得られます
.split("")
やります。
回答:
"cat".split("(?!^)")
これは
配列["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]);
文字列を1文字の文字列の配列に変換する効率的な方法は、次のようにすることです。
String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
res[i] = Character.toString(str.charAt(i));
}
ただし、これはchar
、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
にコピーする必要があるためです。
元の文字列が含まれている場合、補助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);
}