6

ファイルを 1 行ずつ読んでいて、特定の区切り文字に基づいて各行を分割したいと考えています。String クラスと StringUtils クラスで利用可能なオプションがいくつか見つかりました。

だから私の質問は、どちらを使用するのがより良いオプションであり、その理由は何ですか?

4

3 に答える 3

9

ユースケースによって異なります。

違いは何ですか?

String[] split(String regEx)

String[] results = StringUtils.split(String str,String separatorChars)

  1. Apache utils split() はヌルセーフです。StringUtils.split(null)戻りnullます。JDK のデフォルトは null セーフではありません。

    try{ String testString = null; String[] result = testString.split("-"); System.out.println(result.length); } catch(Exception e) { System.out.println(e); // results NPE }

  2. デフォルトのString#split()は、文字列の分割に正規表現を使用します。
    Apache バージョンのStringUtils#split()は、空白/文字/文字列文字/null を使用します [split() メソッドの署名に依存します]。
    複雑な正規表現は広範囲に使用すると非常にコストがかかるため、デフォルトString.split()はお勧めできません。そうでなければ、それは良いです。

  3. 次のように文字列をトークン化するために使用すると、string.split() は追加の空の文字列を返します。一方、Apache のバージョンでは正しい結果が得られました

     String testString = "$Hello$Dear$";

     String[] result = testString.split("\\$");
     System.out.println("Length is "+ result.length); //3
     int i=1;
     for(String str : result) {
        System.out.println("Str"+(i++)+" "+str);
     }

出力

Length is 3
Str1 
Str2 Hello
Str3 Dear

String[] result = StringUtils.split(testString,"$");
System.out.println("Length is "+ result.length); // 2
int i=1;
for(String str : result) {
    System.out.println("Str"+(i++)+" "+str);
}

出力

Length is 2
Str1 Hello
Str2 Dear
于 2014-09-20T06:47:45.340 に答える
1

StringUtils.split のドキュメントには次のように記載されていることに注意してください。隣接するセパレーターは 1 つのセパレーターとして扱われます。 ,"" ,"parm4"] StringUtils.splitPreserveAllTokens が必要です

于 2016-09-09T11:36:12.683 に答える