JavaStringTokenizerのクイックガイド
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 /FloatのListを使用する場合は、 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で利用できます。