覚えたら書く

IT関係のデベロッパとして日々覚えたことを書き残したいです。twitter: @yyoshikaw

com.google.common.base.Splitter

Guavacom.google.common.base.Splitterの利用サンプルです。
指定の文字列を分割する際に利用するクラスです。
String#splitがString[]を返却するのに対してSplitter#splitはIterable<String>を返却します。

以下のAPIなどを利用して分割処理を行います

  • Splitter#split - 指定の文字列を分割してIterableを返却します。
  • Splitter#on - 分割する際の区切り文字を指定します。
  • Splitter#trimResults - 分割する際にトリムを実行します。
  • Splitter#omitEmptyStrings - 分割後に空文字となった要素を返却値から除外します。
  • Splitter#limit - 分割する際の最大要素数を指定します。
  • Splitter#fixedLength - 文字列を分割する際の各要素の長さを指定します。
  • Splitter.MapSplitter#split - 文字列を分割してMap<String,String>を返却します。

サンプルコードで試したのは以下の通りです。


文字列を分割

■サンプル

String srcStr1 = "aaa,bbb,   ccc,ddd   ";

Iterable<String> dest1 = Splitter.on(",")
        .split(srcStr1);

System.out.println("dest1: " + dest1);

■実行結果

dest1: [aaa, bbb,    ccc, ddd   ]


文字列を分割+トリム

■サンプル

String srcStr2 = "aaa,bbb,   ccc,ddd   ";

Iterable<String> dest2 = Splitter.on(",")
        .trimResults()
        .split(srcStr2);

System.out.println("dest2: " + dest2);

■実行結果

dest2: [aaa, bbb, ccc, ddd]


文字列を分割+トリム(トリムする文字('_')を指定)

■サンプル

String srcStr3 = "aaa,bbb_,___ccc,ddd_ ";

Iterable<String> dest3 = Splitter.on(",")
        .trimResults(CharMatcher.is('_'))
        .split(srcStr3);

System.out.println("dest3: " + dest3);

■実行結果

dest3: [aaa, bbb, ccc, ddd_ ]


文字列を分割+トリム+空要素は除外

■サンプル

String srcStr4 = "aaa1,bbb2,ccc3,  ,ddd4   ,";

// 空要素の除外なし
Iterable<String> dest4_1 = Splitter.on(",")
        .trimResults()
        .split(srcStr4);

// 空要素の除外あり
Iterable<String> dest4_2 = Splitter.on(",")
        .trimResults()
        .omitEmptyStrings()
        .split(srcStr4);

System.out.println("dest4_1(not execute omitEmptyStrings): " + dest4_1);
System.out.println("dest4_2(execute omitEmptyStrings): " + dest4_2);

■実行結果

dest4_1(not execute omitEmptyStrings): [aaa1, bbb2, ccc3, , ddd4, ]
dest4_2(execute omitEmptyStrings): [aaa1, bbb2, ccc3, ddd4]


分割する要素数の最大値を指定してから文字列を分割

■サンプル

String srcStr5 = "aaa,bbb,ccc,ddd,eeeeeeeeee";

// 最大3要素の分割に制限
Iterable<String> dest5 = Splitter.on(",")
        .limit(3)
        .split(srcStr5);

System.out.println("dest5: " + dest5);   // ちょっとこれだと分かりにくいですが・・

■実行結果

dest5: [aaa, bbb, ccc,ddd,eeeeeeeeee]


分割後の要素の長さを指定して文字列を分割

■サンプル

String srcStr6 = "A001B001C001D001E0002";

Iterable<String> dest6 = Splitter.fixedLength(4)
        .split(srcStr6);

System.out.println("dest6: " + dest6);

■実行結果

dest6: [A001, B001, C001, D001, E000, 2]


文字列をMapに分割

■サンプル

String srcStr7 = "key1=value1 ; key2=value2 ; key3=value3";

Map<String, String> map = Splitter.on(";")
        .trimResults()
        .withKeyValueSeparator("=")
        .split(srcStr7);

System.out.println("dest map : " + map);

■実行結果

dest map : {key1=value1, key2=value2, key3=value3}




試したソースコードの全体は以下です。

import com.google.common.base.CharMatcher;
import com.google.common.base.Splitter;
import java.util.Map;

public class SplitterClient {

    public static void main(String[] args) {

        // カンマで文字列 を分割してみる
        System.out.println("### execute Splitter.on(\",\").split");
        String srcStr1 = "aaa,bbb,   ccc,ddd   ";
        Iterable<String> dest1 = Splitter.on(",")
                .split(srcStr1);
        System.out.println("dest1: " + dest1);

        // カンマで文字列を分割+トリム を実施してみる
        System.out.println("### execute Splitter.on(\",\").trimResults.split");
        String srcStr2 = "aaa,bbb,   ccc,ddd   ";
        Iterable<String> dest2 = Splitter.on(",")
                .trimResults()
                .split(srcStr2);
        System.out.println("dest2: " + dest2);

        // カンマで文字列を分割+トリム(トリムする文字('_')を指定) を実施してみる
        String srcStr3 = "aaa,bbb_,___ccc,ddd_ ";
        Iterable<String> dest3 = Splitter.on(",")
                .trimResults(CharMatcher.is('_'))
                .split(srcStr3);
        System.out.println("dest3: " + dest3);

        // カンマで文字列を分割+トリム+空要素は除外 を実施してみる
        System.out.println("### execute Splitter.on(\",\").trimResults.omitEmptyStrings.split");
        String srcStr4 = "aaa1,bbb2,ccc3,  ,ddd4   ,";
        Iterable<String> dest4_1 = Splitter.on(",")
                .trimResults()
                .split(srcStr4);
        Iterable<String> dest4_2 = Splitter.on(",")
                .trimResults()
                .omitEmptyStrings()
                .split(srcStr4);
        System.out.println("dest4_1(not execute omitEmptyStrings): " + dest4_1);
        System.out.println("dest4_2(execute omitEmptyStrings): " + dest4_2);

        // カンマで文字列を分割+分割する要素数の最大値指定 を実施してみる
        System.out.println("### execute Splitter.on(\",\").limit.split");
        String srcStr5 = "aaa,bbb,ccc,ddd,eeeeeeeeee";
        Iterable<String> dest5 = Splitter.on(",")
                .limit(3)
                .split(srcStr5);
        System.out.println("dest5: " + dest5);   // ちょっとこれだと分かりにくいですが・・

        // 分割後の要素の長さを指定して文字列を分割する を実施してみる
        System.out.println("### execute Splitter.on(\",\").fixedLength.split");
        String srcStr6 = "A001B001C001D001E0002";
        Iterable<String> dest6 = Splitter.fixedLength(4)
                .split(srcStr6);
        System.out.println("dest6: " + dest6);

        // MapSplitterにより文字列をMapに分割する を実施してみる
        System.out.println("### execute Splitter.on(\",\").withKeyValueSeparator.split");
        String srcStr7 = "key1=value1 ; key2=value2 ; key3=value3";
        Map<String, String> map = Splitter.on(";")
                .trimResults()
                .withKeyValueSeparator("=")
                .split(srcStr7);
        System.out.println("dest map : " + map);
    }
}



関連エントリ