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アプローチ
StringTokenizerはEnumeration<Object>インターフェースを実装しているため、JavaのCollectionsインターフェースで使用できます。
前の例を検討すると、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/FloatのListを使用する場合は、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. トークンの長さ
利用可能なトークンの数を数えるために、StringTokenizerのsizeメソッドを使用できます。
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で利用できます。