10

トークンに分割されたコンマを分割するという一見単純な問題がありますString。これにより、次の場合に出力に空のトークンが含まれるはずです。

  • の最初の文字はStringコンマです。
  • の最後の文字はStringコンマです。
  • 2つの連続したコンマが発生します。

たとえば、String",abd,def,,ghi,"の場合、出力は次のようになります{"", "abd", "def", "", "ghi", ""}

私はを使用してみString.splitましたがScannerStringTokenizerこれにはそれぞれ異なる望ましくない出力が表示されます(以下の例)。誰かがこれに対するエレガントな解決策を提案できますか、できればJDKクラスを使用しますか?もちろん、自分で何かをコーディングすることもできますが、前述の3つのアプローチのいずれかで何かが欠けているように感じます。区切り文字は固定Stringですが、必ずしもコンマや1文字である必要はありません。

サンプルコード

import java.util.*;

public class Main12 {
  public static void main(String[] args) {
    String s = ",abd,def,,ghi,";
    String[] tokens = s.split(",");

    System.err.println("--- String.split Output ---");
    System.err.println(String.format("%s -> %s", s, Arrays.asList(tokens)));

    for (int i=0; i<tokens.length; ++i) {
      System.err.println(String.format("tokens[%d] = %s", i, tokens[i]));
    }

    System.err.println("--- Scanner Output ---");

    Scanner sc = new Scanner(s);
    sc.useDelimiter(",");
    while (sc.hasNext()) {
      System.err.println(sc.next());
    }

    System.err.println("--- StringTokenizer Output ---");

    StringTokenizer tok = new StringTokenizer(s, ",");
    while (tok.hasMoreTokens()) {
      System.err.println(tok.nextToken());
    }
  }
}

出力

$ java Main12
--- String.split Output ---
,abd,def,,ghi, -> [, abd, def, , ghi]
tokens[0] =
tokens[1] = abd
tokens[2] = def
tokens[3] =
tokens[4] = ghi
--- Scanner Output ---
abd
def

ghi
--- StringTokenizer Output ---
abd
def
ghi
4

1 に答える 1

23

引数としてに-1を渡します。splitlimit

String s = ",abd,def,,ghi,";
String[] tokens = s.split(",", -1);

次に、結果の配列に末尾の空の文字列が含まれます。

javadocsから:

[制限]が正でない場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができます。[制限]がゼロの場合、パターンは可能な限り何度も適用され、配列は任意の長さにすることができ、末尾の空の文字列は破棄されます。

呼び出しは引数がでsplit(regex)あるかのように機能するため、末尾の空の文字列は破棄されます。limit0

于 2012-09-12T20:40:15.867 に答える