web-dev-qa-db-ja.com

Javaの文字列トークナイザー

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

ABC | DEF || FGHT

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

結果は-ABC、DEF、 ""、FGHTになりますが、ABC、DEF、FGHTになります。

21
ASD

StringTokenizerドキュメントから:

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

次のコードが動作するはずです:

String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
60
Desintegr

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));を使用して自動的に

15
sfussenegger

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

Javadocsから:

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

9
Ryan Emerle

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

   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;
   }

追加の 'returnDelims'ブール値を受け取るコンストラクターを使用して、trueを渡すことができます。この方法で、デリミタを受け取ります。これにより、この状態を検出できます。

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

2
Omry Yadan

これは簡単です...

    import Java.util.StringTokenizer;

    class stringtoken{
        public static void main (String args[]){

            String s1 = "StringTokenizer|by|Himal";

            StringTokenizer stt = new StringTokenizer(s1,"|");

            while (stt.hasMoreTokens()){
                String token = stt.nextToken();
                System.out.println(token);
            }
        }
    }

結果:

    StringTokenizer
    by
    Himal
1
MacKa

文字列をトークンに分割する方法を次に示します(トークンは1つ以上の文字です)

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);
    String s = scan.nextLine();
    s = s.replaceAll("[^A-Za-z]", " ");
    StringTokenizer arr = new StringTokenizer(s, " ");
    int n = arr.countTokens();
    System.out.println(n);
    while(arr.hasMoreTokens()){
        System.out.println(arr.nextToken());
    }
    scan.close();
}
0
Justin Gorny
package com.Java.String;

import Java.util.StringTokenizer;

public class StringWordReverse {

    public static void main(String[] kam) {
        String s;
        String sReversed = "";
        System.out.println("Enter a string to reverse");
        s = "THIS IS ASHIK SKLAB";
        StringTokenizer st = new StringTokenizer(s);


        while (st.hasMoreTokens()) {
            sReversed = st.nextToken() + " " + sReversed;
        }

        System.out.println("Original string is : " + s);
        System.out.println("Reversed string is : " + sReversed);

    }
}

出力:

逆にする文字列を入力してください

元の文字列は次のとおりです。THISIS ASHIK SKLAB

逆の文字列は次のとおりです。SKLABASHIK IS THIS

0
Ashik ali