【Java】文字列分割の要素数について検証【split】

Javaにて文字列を分割するためには「split」を使用すると思います。

splitの分割結果について気になることがあったので色々検証してみました。本記事では分割後の配列の要素数を指定した場合の結果を中心に見ていきます。

ちょっとした暇つぶし感覚でお付き合いいただけると幸いです。

1. splitの基本

分割したい文字列を準備し、分割の目印になる区切り文字および分割後の配列の要素数を指定します。配列の要素数は省略可能です。

分割結果はString型の配列として格納されます。

String型配列 = String型変数.split(区切り文字,配列の要素数);

リファレンスのリンクも添付しておくので、詳細を確認したい方はご覧ください。(リンク先はJava17です。)

https://docs.oracle.com/javase/jp/17/docs/api/java.base/java/lang/String.html

2. 検証

分割の詳細はリファレンスにて確認できますが、わかりづらい点や個人的に確認したい点を実際に検証していきます。

2-1. 要素数省略

配列の要素数は省略可能です。省略した場合は分割した文字列すべてが配列に格納されます。

他の検証との比較のためにコードと実行結果も載せておきます。

コード

public class Sample {
    public static void main(String[] args) {        
        String text = "banana is apple!";
        String[] mozis = text.split("a");
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果

要素数:5
b
n
n
 is 
pple!

今回用意した文字列と区切り文字では、5つに分割できたことがわかります。

空白もしっかり分割されていることが確認できました。

2-2. 要素数 > 分割結果 を指定

今回の文字列では分割結果の要素数は最大で「5」になることが確認できました。

では、要素数に「5より大きな数字」を指定したらどのような結果になるのか確認します。

コード

public class Sample {
    public static void main(String[] args) {        
        String text = "banana is apple!";
        String[] mozis = text.split("a",10);
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果

要素数:5
b
n
n
 is 
pple!

分割後の要素数が指定した要素数を超えることがないというだけなので、省略した場合と結果は同じになりました。

2-3. 要素数 < 分割結果 を指定

分割結果より小さな値が指定されている場合、どのような結果になるか確認します。(今回は「2」を指定します。)

コード

public class Sample {
    public static void main(String[] args) {        
        String text = "banana is apple!";
        String[] mozis = text.split("a",2);
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果

要素数:2
b
nana is apple!

実行結果から指定した要素数より大きな結果にならないことが確認できました。

また、文字列は先頭から分割され、要素数に達した場合は以降の文字列がすべて1つの配列に格納されています。区切り文字が含まれていても、分割されずそのまま格納されています。

2-4. 「0」を指定

これまでは正の値を指定していましたが、「0」の場合どのような結果になるでしょうか。

コード

public class Sample {
    public static void main(String[] args) {        
        String text = "banana is apple!";
        String[] mozis = text.split("a",0);
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果

要素数:5
b
n
n
 is 
pple!

要素数を省略した場合と同じ結果になりました。

2-5. 負の値を指定

負の値を指定した場合どのような結果になるでしょうか。

コード

public class Sample {
    public static void main(String[] args) {        
        String text = "banana is apple!";
        String[] mozis = text.split("a",-1);
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果

要素数:5
b
n
n
 is 
pple!

要素数を省略した場合、「0」を指定した場合と同じ結果になりました。

ここで「まったく同じ結果になるのか?」と思いリファレンスを確認したところ、違う結果になる場合があるようなのでそれについても次で確認します。

2-x. 省略・0・負 の違いは?

要素数を「省略」、「0」、「負の値」を指定した結果が同じになってしまいました。

そこで、リファレンスを再度確認したところ、あらかじめ用意した分割前の文字列が検証としては良くなかったことがわかりました。

リファレンスによると、「省略」と「0」の場合は分割前の文字列の最後が空文字(“”)の場合、取り除かれてしまうようです。逆に「負の値」では取り除かれないようです。

では、実際に確認してみます。今回は分割前の文字列に「banana!a」を用意しました。

コード (省略した場合)

public class Sample {
    public static void main(String[] args) {        
        String text = "banana!a";
        String[] mozis = text.split("a");
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果 (省略した場合)

要素数:4
b
n
n
!

実行結果から最後の「a」の部分は、分割すると末尾が空文字(“”)になってしまうので取り除かれてしまったことが確認できます。

コード (0の場合)

public class Sample {
    public static void main(String[] args) {        
        String text = "banana!a";
        String[] mozis = text.split("a",0);
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果 (0の場合)

要素数:4
b
n
n
!

要素数を省略した場合と同じように、末尾の空文字が取り除かれてしまったことが確認できます。

コード (負の値の場合)

public class Sample {
    public static void main(String[] args) {        
        String text = "banana!a";
        String[] mozis = text.split("a",-1);
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果 (負の値の場合)

要素数:5
b
n
n
!

要素数に負の値を指定した場合、分割後の配列の要素数は「5」であり空文字も要素として格納されていることが確認できました。

2-xx. 要素数>分割結果 のとき末尾の空文字は?

最後におまけになりますが、分割結果よりも大きな値が指定されていた場合に、末尾に空文字があると取り除かれるのか否か確認します。

コード

public class Sample {
    public static void main(String[] args) {        
        String text = "banana!a";
        String[] mozis = text.split("a",10);
        
        // 分割結果確認用↓
        System.out.println("要素数:" + mozis.length);
        for(String mozi : mozis) {
            System.out.println(mozi);
        }
    }
}

実行結果

要素数:5
b
n
n
!

末尾の空文字は取り除かれないという結果でした。

3. まとめ

今回はJavaの「split」について色々と確認しました。

普段は要素数を省略する書き方しか使用しないので、実際に検証することで改めて理解が深まりました。リファレンスをきちんと確認することは大切ですね。