1. 概要

この簡単な記事では、Javaの基本クラスであるStringTokenizerについて説明します。

2. StringTokenizer

StringTokenizer クラスは、文字列を複数のトークンに分割するのに役立ちます。

StreamTokenizer は同様の機能を提供しますが、トークン化メソッドはStreamTokenizerクラスで使用されるメソッドよりもはるかに単純です。 StringTokenizer のメソッドは、識別子、数値、引用符で囲まれた文字列を区別せず、コメントを認識してスキップしません。

区切り文字のセット(トークンを区切る文字)は、作成時またはトークンごとに指定できます。

3. StringTokenizerの使用

StringTokenizer を使用する最も簡単な例は、指定された区切り文字に基づいてStringを分割することです。

この簡単な例では、引数Stringを分割し、トークンをリストに追加します

public List<String> getTokens(String str) {
    List<String> tokens = new ArrayList<>();
    StringTokenizer tokenizer = new StringTokenizer(str, ",");
    while (tokenizer.hasMoreElements()) {
        tokens.add(tokenizer.nextToken());
    }
    return tokens;
}

Stringを区切り文字’‘に基づいてトークンのリストに分割していることに注目してください。 次に、ループで tokens.add()メソッドを使用します。 各トークンをArrayList。に追加します

たとえば、ユーザーが「 Welcome、to、baeldung.com 」と入力した場合、このメソッドは3語のフラグメントを含むリストを「 Welcome 」、「to」および「baeldung.com」。

3.1. Java8アプローチ

以来 StringTokenizer 実装列挙インターフェイス、Jで使用できますエイバコレクションインターフェース。

前の例を検討すると、 Collections.list()メソッドと StreamAPIを使用して同じトークンのセットを取得できます。

public List<String> getTokensWithCollection(String str) {
    return Collections.list(new StringTokenizer(str, ",")).stream()
      .map(token -> (String) token)
      .collect(Collectors.toList());
}

ここでは、 StringTokenizer自体をCollections.list()メソッドのパラメーターとして渡します。

ここで注意すべき点は、列挙型はオブジェクト型であるため、トークンを文字列型に型キャストする必要があるということです(つまり、 実装によって異なります。 Integer /FloatListを使用する場合は、 Integer /Floatで型キャストする必要があります。

3.2. StringTokenizerのバリアント

StringTokenizer には、デフォルトのコンストラクターのほかに、 StringTokenizer(String str) StringTokenizer(String str、String delim、boolean returnDelims):の2つのオーバーロードされたコンストラクターが付属しています。

StringTokenizer(String str、String delim、boolean returnDelims)は、追加のboolean入力を受け取ります。 booleanの値がtrueの場合、 StringTokenizer は区切り文字自体をトークンと見なし、トークンの内部プールに追加します。

StringTokenizer(String str)は、前の例のショートカットです。 ハードコードされた区切り文字を” \ t \ n \ r \ f” として、ブール値をfalseとして内部的に他のコンストラクターを呼び出します。

3.3. トークンのカスタマイズ

StringTokenizer には、文字列フラグメントを入力として受け取るオーバーロードされた nextToken()メソッドも付属しています。 このStringフラグメントは、追加の区切り文字セットとして機能します。 どのトークンが再編成されるかに基づいています。

たとえば、 nextToken()メソッドで’ e ‘を渡して、区切り文字’ e‘に基づいて文字列をさらに分割できる場合:

tokens.add(tokenizer.nextToken("e"));

したがって、「 Hello、baeldung.com 」の特定の文字列に対して、次のトークンを生成します。

H
llo
ba
ldung.com

3.4. トークンの長さ

To count the available numbers of tokens, we can use StringTokenizer‘s countTokens method:

int tokenLength = tokens.countTokens();

3.5. CSVファイルからの読み取り

それでは、実際のユースケースでStringTokenizerを使用してみましょう。

CSVファイルからデータを読み取り、ユーザー指定の区切り文字に基づいてデータを解析しようとするシナリオがあります。

StringTokenizer を使用すると、簡単にアクセスできます。

public List<String> getTokensFromFile( String path , String delim ) {
    List<String> tokens = new ArrayList<>();
    String currLine = "";
    StringTokenizer tokenizer;
    try (BufferedReader br = new BufferedReader(
        new InputStreamReader(Application.class.getResourceAsStream( 
          "/" + path )))) {
        while (( currLine = br.readLine()) != null ) {
            tokenizer = new StringTokenizer( currLine , delim );
            while (tokenizer.hasMoreElements()) {
                tokens.add(tokenizer.nextToken());
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return tokens;
}

ここで、関数は2つの引数を取ります。 1つはCSVファイル名(つまり リソース[src->main-> resources] フォルダーから読み取り、もう1つを区切り文字として読み取ります。

この2つの引数に基づいて、CSVデータは行ごとに読み取られ、各行はStringTokenizerを使用してトークン化されます。

たとえば、CSVには次のコンテンツを入れています。

1|IND|India
2|MY|Malaysia
3|AU|Australia

したがって、次のトークンを生成する必要があります。

1
IND
India
2
MY
Malaysia
3
AU
Australia

3.6. テスト

それでは、簡単なテストケースを作成しましょう。

public class TokenizerTest {

    private MyTokenizer myTokenizer = new MyTokenizer();
    private List<String> expectedTokensForString = Arrays.asList(
      "Welcome" , "to" , "baeldung.com" );
    private List<String> expectedTokensForFile = Arrays.asList(
      "1" , "IND" , "India" , 
      "2" , "MY" , "Malaysia" , 
      "3", "AU" , "Australia" );

    @Test
    public void givenString_thenGetListOfString() {
        String str = "Welcome,to,baeldung.com";
        List<String> actualTokens = myTokenizer.getTokens( str );
 
        assertEquals( expectedTokensForString, actualTokens );
    }

    @Test
    public void givenFile_thenGetListOfString() {
        List<String> actualTokens = myTokenizer.getTokensFromFile( 
          "data.csv", "|" );
 
        assertEquals( expectedTokensForFile , actualTokens );
    }
}

4. 結論

このクイックチュートリアルでは、コアJava StringTokenizerを使用する実際の例をいくつか見てきました。

いつものように、完全なソースコードはGitHub利用できます。