2013-02-27 12 views
19

I次の例では、より良い私がやろうとしているかを説明する必要があります:私は何をしたい、のJava分割

I = 0 a 

I = 1 b 

I = 2 

I = 3 

I = 4 

I = 5 c 

しかし:

String text = "a,b,,,,c,,"; 
String[] split = text.split(","); 
for(int i=0;i<split.length;i++){ 
    System.out.println("I = "+i+" "+split[i]); 
} 

が出力されます

I = 6 

I = 7 

もちろん、最後の2つの要素は空文字列ですが、m彼らを得るためにe。また、私はそれが理にかなっていると思います。私が持っていた場合、私は、意味:

String text = "a,b,,,,c,,d"; 

結果は、サイズ8の配列となり、私は2例の間には大きな差があるとは思いません。

答えて

26
String[] split = text.split(",", -1); 

この動作は、実際にトリッキーに見えますが、それは実際にofficial documentationで(言っていない非常によく私見を、)説明されています。

はnは非正である場合、パターンは何度でも可能 として適用され、アレイは、任意の長さ

を有することができるtext.split(",")に伴う問題は、それがtext.split(",", 0)に等しいということです。ドキュメントで説明したように、0限界を用いて、nは、パターンが 可能な回数だけ適用されるゼロの場合

は、アレイは、任意の長さを有することができ、は が破棄される空の文字列の末尾

あなたは間違いなく空の文字列を破棄したくありません。

+6

ワウ。私は 'String#split'のような基本的なことについて新しいことを学ぶことはできないと思った。私は間違っていた。質問と答えはともにとても教育的でした。それは、ユーザーの説明*を提供することは良い答えを取って、それを大きくするだろうと言った。 –

+0

ありがとう、それは素晴らしい作品!私は約3年間javaでアプリケーションをプログラミングしましたが、一見してもシンプルに見えても、常に新しいことがあるようです。 – Anakin001

+0

@ T.J.Crowder先週この問題が発生しましたが、これはうまくいきました。私は実際にそれがなぜうまくいかないのか、それはどういう仕組みで、ドキュメントはそれほど明確ではないのですか? – m0skit0

0

(あなたが外部のライブラリを使用できるかどうか)私が好む:StringUtilsライブラリがあるため、デフォルトのJava実装よりもちょうどその少しより効率的になる傾向があるほとんどの部分について

String[] split = StringUtils.splitPreserveAllTokens(text, ',');

...よく、ちょっと、それはApacheがそれを書いているのを悩ましている理由です。加えて、この分割がメソッド名から何をしているのかはっきりしていますが、一見すると、-1という制限付きの通常の文字列分割はそうではないかもしれません。