1概要

このクイック記事では、Javaの基本クラスである



StringTokenizer



について説明します。

** 2

StringTokenizer

**


StringTokenizer

クラスは

Strings

を複数のトークンに分割するのを助けます



StreamTokenizer


も同様の機能を提供しますが、トークン化方法はhttps://docsで使用される方法よりもずっと簡単です。 oracle.com/javase/8/docs/api/java/io/StreamTokenizer.html[

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. Java 8アプローチ


StringTokenizer



Enumeration <Object>

インターフェースを実装しているので、J

__avaの

Collections__インターフェースで使用できます。

前の例を検討すると、

Collections.list()

methodと

Stream

APIを使用して同じトークンのセットを取得できます。

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

ここでは、

StringTokenizer

自体を

Collections.list()

メソッドのパラメータとして渡しています。

  • ここで注意しなければならないのは、

    Enumeration



    Object

    タイプなので、トークンを

    String

    タイプ** にタイプキャストする必要があるということです(つまり、実装によって異なります。

    Integer/Float

    )でキャストします。

** 3.2.

StringTokenizer

の亜種

**


StringTokenizer

には、デフォルトのコンストラクタの他に、2つのオーバーロードされたコンストラクタがあります。


  • StringTokenizer(String str、String delim、論理型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"));

したがって、「

こんにちは、baeldung.com

」という文字列に対して、次のトークンが生成されます。

H
llo
ba
ldung.com

** 3.4. トークン長

**

利用可能なトークンの数を数えるには、

StringTokenizer

‘s s

size

メソッドを使います。

int tokenLength = tokens.size();


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ファイル名(つまりresources

[src – > main – > resources]

フォルダーから読み取る)で、もう1つは区切り文字として。

この2つの引数に基づいて、CSVデータは1行ずつ読み取られ、各行は

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

を使用した実際的な例をいくつか見てきました。

いつものように、完全なソースコードはhttps://github.com/eugenp/tutorials/tree/master/java-strings[over on GitHub]から入手可能です。