22

'|'で区切られたデータを含むテキストファイルがあります。各フィールド(「|」で区切られている)を取得して処理する必要があります。テキストファイルは次のように表示できます。

ABC | DEF || FGHT

各フィールド値を取得するために文字列トークナイザー(JDK 1.4)を使用しています。問題は、DEFの後に空の文字列を取得する必要があるということですが、DEFとFGHTの間に空のスペースがありません。

結果は-ABC、DEF、 ""、FGHTになりますが、ABC、DEF、FGHTを取得しています

4

7 に答える 7

60

StringTokenizerドキュメントから:

StringTokenizerは、互換性の理由で保持されているレガシークラスですが、新しいコードでは使用しないでください。この機能を求める人は、代わりにStringのsplitメソッドまたはjava.util.regexパッケージを使用することをお勧めします。

次のコードが機能するはずです:

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
于 2010-03-01T14:04:45.617 に答える
15

returnDelimsフラグを使用して、区切り文字の2つの後続の出現を確認します。

String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);

boolean expectDelim = false;
while (tok.hasMoreTokens()) {
    String token = tok.nextToken();
    if (delim.equals(token)) {
        if (expectDelim) {
            expectDelim = false;
            continue;
        } else {
            // unexpected delim means empty token
            token = null;
        }
    }

    System.out.println(token);
    expectDelim = true;
}

このプリント

ABC
DEF
null
FGHT

APIはきれいではないため、レガシー(つまり「ほとんど時代遅れ」)と見なされます。パターンマッチングが高すぎる場合(これは非常に長い文字列の場合にのみ当てはまるはずです)、またはAPIが列挙を期待する場合にのみ使用してください。

に切り替える場合はString.split(String)、必ず区切り文字を引用符で囲んでください。手動("\\|")または自動でstring.split(Pattern.quote(delim));

于 2010-03-01T14:07:14.600 に答える
9

StringTokenizerは空の要素を無視します。String.splitの使用を検討してください。これは、1.4でも使用できます。

javadocsから:

StringTokenizerは、互換性の理由で保持されているレガシークラスですが、新しいコードでは使用しないでください。この機能を求める人は、代わりにStringのsplitメソッドまたはjava.util.regexパッケージを使用することをお勧めします。

于 2010-03-01T14:06:01.480 に答える
2

余分な'returnDelims'ブール値を受け取るコンストラクターを使用して、それにtrueを渡すことができます。このようにして、この状態を検出できる区切り文字を受け取ります。

あるいは、必要なことを実行する独自の文字列トークナイザーを実装することもできますが、それほど難しくはありません。

于 2010-03-01T14:03:21.113 に答える
2

この問題を解決する別の方法があります

   String str =  "ABC|DEF||FGHT";
   StringTokenizer s = new StringTokenizer(str,"|",true);
   String currentToken="",previousToken="";


   while(s.hasMoreTokens())
   {
    //Get the current token from the tokenize strings
     currentToken = s.nextToken();

    //Check for the empty token in between ||
     if(currentToken.equals("|") && previousToken.equals("|"))
     {
        //We denote the empty token so we print null on the screen
        System.out.println("null");
     }

     else
     {
        //We only print the tokens except delimiters
        if(!currentToken.equals("|"))
        System.out.println(currentToken);
     }

     previousToken = currentToken;
   }
于 2015-03-29T05:50:48.097 に答える