Java StringTokenizerのクイックガイド

Java StringTokenizerのクイックガイド

1. 概要

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

2. StringTokenizer

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

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

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

3. StringTokenizerの使用

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

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

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

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

たとえば、ユーザーが「Welcome,to,example.com」として入力した場合、このメソッドは、「Welcome」、「to」、および「%(t3」として3語のフラグメントを含むリストを返す必要があります。 )s "。

3.1. Java8アプローチ

StringTokenizerEnumeration<Object>インターフェースを実装しているため、JavaCollectionsインターフェースで使用できます。

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

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

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

Point to note here is that, since the Enumeration is an Object type, we need to type-cast the tokens to String type(つまり、 実装によって異なります。 Integer/FloatListを使用する場合は、Integer/Floatで型キャストする必要があります)。

3.2. StringTokenizerのバリアント

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

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

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

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

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

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

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

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

H
llo
ba
ldung.com

3.4. トークンの長さ

利用可能なトークンの数を数えるために、StringTokenizersizeメソッドを使用できます。

int tokenLength = tokens.size();

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

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

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

StringTokenizerを使用すると、簡単にそこに到達できます。

public List getTokensFromFile( String path , String delim ) {
    List 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データは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 expectedTokensForString = Arrays.asList(
      "Welcome" , "to" , "example.com" );
    private List expectedTokensForFile = Arrays.asList(
      "1" , "IND" , "India" ,
      "2" , "MY" , "Malaysia" ,
      "3", "AU" , "Australia" );

    @Test
    public void givenString_thenGetListOfString() {
        String str = "Welcome,to,example.com";
        List actualTokens = myTokenizer.getTokens( str );

        assertEquals( expectedTokensForString, actualTokens );
    }

    @Test
    public void givenFile_thenGetListOfString() {
        List actualTokens = myTokenizer.getTokensFromFile(
          "data.csv", "|" );

        assertEquals( expectedTokensForFile , actualTokens );
    }
}

4. 結論

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

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