11

文字列を単一文字の配列に分割しようとしていました。これが私がしたことです、

String str = "abcddadfad"; 
System.out.println(str.length());    //  output: 10  
String[] strArr = str.split("");  
System.out.println(strArr.length);   //  output: 11   
System.out.println(strArr[0]);       // output is nothing 

新しい配列にはすべての文字が含まれていましたが、インデックス 0 には何もなく、空白もありませんが、それでも配列のサイズが増加しました。なぜこれが起こっているのか誰でも説明できますか?

4

4 に答える 4

14

分割式を検討する",1,2,3,4".split(",");

あなたは何を期待しますか?そうです、最初は空の文字列です。あなたの場合、最初の「a」の前とその後ろに「何もない」があります。

更新: コメントは、この説明が説明として十分ではないことを示しています (そうではないかもしれません)... しかし、それは本当に単純です: エンジンは文字列の先頭から始まり、文字列の前に何があるかを確認します。パターンに一致します。存在する場合は、その背後にあるものを分割内の新しいアイテムに割り当てます。

最初の文字には "" (後ろに何もない) があり、その前に "" (パターン) があるかどうかを調べます。あるので、"" マッチを作成します。

次に進み、後ろに 'a' があり、再び前に "" があります。したがって、2 番目の結果は "a" 文字列です。

興味深いことに、 を使用split("", -1)すると、結果配列の最後の位置に空の文字列の結果も得られます。


編集2:さらに頭を悩ませ、これを学術的な演習と見なすと(これは実際にはお勧めしません...)split()、文字列の正規表現をString[]配列に変換する良い方法は1つだけ考えられます各文字列に 1 文字 (char[] とは対照的に - 他の人が素晴らしい回答を与えている....)。

String[] chars = str.split("(?<=.)", str.length());

これは、非キャプチャ グループ内の各文字の後ろを見て、それを分割し、配列のサイズを文字数に制限します (省略できますが、最後に余分なスペースができますstr.length()) 。 -1)

文字列の先頭と末尾を参照する nitro2k01 の代替 (以下のコメント) を借りると、次の場所で確実に分割できます。

String[] chars = str.split("(?!(^|$))");
于 2013-11-15T04:16:35.197 に答える
2

文字列クラスから組み込みの Java メソッドを使用できます。myString.toCharArray()空の文字列はインデックス 0 に格納されています

于 2013-11-15T04:16:07.583 に答える
0

"" が正規表現としてどのように機能するかを正確に理解するには、コードを読む必要があります。ただし、空の文字列に一致することを覚えておいてください...そして引数は正規表現であり、javadoc は、split(regex) の呼び出しは split(regex,0) の呼び出しと同じであると述べています。したがって、残りの文字列がすべて空白 (または空の文字列) である場合は、再度一致を試行しません。これが、最後の文字の後の最後の空の文字列と一致しない理由です。

呼び出すほうがよい関数は、str.toCharArray();

于 2013-11-15T04:21:20.433 に答える
0

この方法を試すこともできます

String str = "abcddadfad";
System.out.println(str.length());  // output: 10
String[] strArr = new String[str.length()];
for (int i = 0; i < strArr.length; i++) {   

strArr[i] = "" + str.charAt(i);

    // As per  ratchet freak comment: it's easier (and more efficient) to use 
     strArr[i] = substring(i,i+1);
}
System.out.println(strArr.length); // output: 10
System.out.println(strArr[0]);     // output: a

通り

于 2013-11-15T04:23:41.517 に答える