web-dev-qa-db-ja.com

文字列を文字列の配列に分割します

文字列を単一文字の文字列の配列に分割する必要があります。

たとえば、「cat」を分割すると、配列「c」、「a」、「t」が得られます

97
Matt
"cat".split("(?!^)")

これは生成します

配列["c"、 "a"、 "t"]

111
coberty
"cat".toCharArray()

しかし、文字列が必要な場合

"cat".split("")

編集:空の最初の値を返します。

96
String str = "cat";
char[] cArray = str.toCharArray();
36
Raman

入力で 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]);
4
Jan Molnar

他の答えをまとめると...

これは、すべてのJavaバージョンで機能します。

"cat".split("(?!^)")

これはJava 8以降でのみ機能します。

"cat".split("")
2
Lezorte

文字列を1文字の文字列の配列に変換する効率的な方法は、次のようにすることです。

String[] res = new String[str.length()];
for (int i = 0; i < str.length(); i++) {
    res[i] = Character.toString(str.charAt(i));
}

ただし、これは、charStringが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);
}  

toCharArraycopy文字を新しい配列に追加する必要があるためです。

1
Stephen C

元の文字列に 補足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);
}
0
Daniel Nitzan