きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

C# × JAVA × String.Splitメソッドの挙動の違い

この記事の目的

この記事では、
JavaC#のString.Splitの挙動の違いについて調べたことのまとめ
を目的としています。

本題

★やっちまったこと

とあるJavaプログラムの実装中に、以下のようにコードを書いていました。

String target = "1,2,3,4,5,,,,,";
String[] list = target.split(",");
System.out.println(list.length); 

この時、list.length(配列の長さ)は、【10】が返ってくるものだと勘違いしたまま実装を続けてしまいました。
実際に帰ってくる値は、【5】です。


Javaでは、Splitメソッドの第二引数に何も指定しない限り、最後の空文字が無視されるようです。
※↓のように、Javadocにも記載されていました。

ーーー
・・・省略・・・・
If limit is zero then the pattern will be applied as many times as possible,
the array can have any length, and trailing empty strings will be discarded.
ーーー


最後の空文字を無視しないようにするためには、splitメソッドのオーバーロードを利用します。

String target = "1,2,3,4,5,,,,,";
String[] list = target.split(",",-1); //負の値であればよいらしい。
System.out.println(list.length);
//10

これで思い通りの挙動になりました(´・ω・`)


…なお、limitを省略したsplitメソッドの呼び出しは、limit=0を指定したときと同じ処理になるそうです。

★.NET(C#)だとどうなるか

比較のため、C#で同じような実装を行ったときの挙動もメモしておきます。

String target = "1,2,3,4,5,,,,,";
var list = target.Split(',');
Console.WriteLine(list.Count());
//10

C#の場合、listの値を問い合わせると、【10】が返ってきます。
こうなってほしかった!

まとめ

初めてのものは、とりあえず取扱説明書をよむべし(/・ω・)/