2

Java エキスパート ,

以下の分割コマンド コードを調べて、最後の 2 つの null がキャプチャされない理由を教えてください。

String test = "1,O1,,,,0.0000,0.0000,,";
String[] splittest = test.split(",");
System.out.println("length -"+splittest.length);
for (String string : splittest) {
    System.out.println("value"+string);
}

結果は得ています

length -7
value1
valueO1
value
value
value
value0.0000
value0.0000

驚くべきことに、長さは 7 ですが、本来は 9 であり、0.0000 の後に値が表示されます。つまり、最後の 2 つの null が来ていません。文字列テスト「1,O1,,,0.0000,0.0000,0,0」を変更するとしましょう

String test = "1,O1,,,,0.0000,0.0000,0,0";
String[] splittest = test.split(",");
System.out.println("length -"+splittest.length);
for (String string : splittest) {
    System.out.println("value"+string);
}

私は正しく取得しています

length -9
value1
valueO1
value
value
value
value0.0000
value0.0000
value0
value0

私は間違っているとは思わない。バグですか?JAVA バージョン - jdk1.6.0_31

4

3 に答える 3

17

javadocで指定されているように動作します。

このメソッドは、指定された式とゼロの制限引数を使用して2引数のsplitメソッドを呼び出すかのように機能します。したがって、末尾の空の文字列は結果の配列に含まれません。

末尾の空白の文字列を保持する場合は、負の制限を指定して2引数のsplitメソッドを使用できます。

String[] splittest = test.split(",", -1);

制限が正でない場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができます。

于 2012-07-10T16:48:57.233 に答える
7

splitJavadocで指定されているように、末尾の区切り文字をサイレントに破棄します。

一般的に、の動作splitは一種の奇妙なものです。代わりにGuava を使用することを検討してくださいSplitter。これは、多少予測可能でカスタマイズ可能な動作を備えています。(開示:私はグアバに貢献します。)

Splitter.on(',').split("1,O1,,,,0.0000,0.0000,,");
// returns [1, O1, , , , 0.0000, 0.0000, , ]
Splitter.on(',').omitEmptyStrings()
  .split("1,O1,,,,0.0000,0.0000,,");
// returns [1, O1, 0.0000, 0.0000]
于 2012-07-10T16:49:06.217 に答える
1

前述のように、test.split(",");末尾の空白文字列は無視されます。2 番目の引数を大きくして 2 つのパラメーターを使用する方法を使用できます。ただし、API には次のようにも記載されています。

If n is non-positive then the pattern will be applied as many times
as possible and the array can have any length.

ここで、n は 2 番目の引数です。したがって、すべての末尾の文字列が必要な場合は、お勧めします

test.split(",", -1);

于 2012-07-10T17:00:23.483 に答える