「|」で区切られたデータを含むテキストファイルがあります。各フィールド(「|」で区切られている)を取得して処理する必要があります。テキストファイルは次のように表示できます。
ABC | DEF || FGHT
各フィールド値を取得するために文字列トークナイザー(JDK 1.4)を使用しています。問題は、DEFの後に空の文字列を取得する必要があることですが、DEFとFGHTの間に空のスペースを取得していません。
結果は-ABC、DEF、 ""、FGHTになりますが、ABC、DEF、FGHTになります。
StringTokenizer
ドキュメントから:
StringTokenizerは、互換性のために保持されているレガシークラスですが、新しいコードでは使用を推奨していません。この機能を探している人は、代わりにStringのsplitメソッドまたはJava.util.regexパッケージを使用することをお勧めします。
次のコードが動作するはずです:
String s = "ABC|DEF||FGHT";
String[] r = s.split("\\|");
returnDelims
フラグを使用して、後続の2つの区切り文字の出現を確認します。
_String str = "ABC|DEF||FGHT";
String delim = "|";
StringTokenizer tok = new StringTokenizer(str, delim, true);
boolean expectDelim = false;
while (tok.hasMoreTokens()) {
String token = tok.nextToken();
if (delim.equals(token)) {
if (expectDelim) {
expectDelim = false;
continue;
} else {
// unexpected delim means empty token
token = null;
}
}
System.out.println(token);
expectDelim = true;
}
_
これは印刷します
_ABC
DEF
null
FGHT
_
APIはきれいではないため、レガシー(つまり、「ほぼ廃止された」)と見なされます。パターンマッチングが高すぎる場合(極端に長い文字列の場合のみ)、またはAPIが列挙を必要とする場合にのみ使用します。
String.split(String)
に切り替える場合は、必ず区切り文字を引用符で囲んでください。手動で(_"\\|"
_)またはstring.split(Pattern.quote(delim));
を使用して自動的に
StringTokenizerは空の要素を無視します。 1.4でも使用可能なString.splitの使用を検討してください。
Javadocsから:
StringTokenizerは、互換性のために保持されているレガシークラスですが、新しいコードでは使用を推奨していません。この機能を探している人は、代わりにStringのsplitメソッドまたはJava.util.regexパッケージを使用することをお勧めします。
この問題を解決する別の方法があります
String str = "ABC|DEF||FGHT";
StringTokenizer s = new StringTokenizer(str,"|",true);
String currentToken="",previousToken="";
while(s.hasMoreTokens())
{
//Get the current token from the tokenize strings
currentToken = s.nextToken();
//Check for the empty token in between ||
if(currentToken.equals("|") && previousToken.equals("|"))
{
//We denote the empty token so we print null on the screen
System.out.println("null");
}
else
{
//We only print the tokens except delimiters
if(!currentToken.equals("|"))
System.out.println(currentToken);
}
previousToken = currentToken;
}
追加の 'returnDelims'ブール値を受け取るコンストラクターを使用して、trueを渡すことができます。この方法で、デリミタを受け取ります。これにより、この状態を検出できます。
あるいは、必要なことを行う独自の文字列トークナイザーを実装することもできますが、それほど難しくはありません。
これは簡単です...
import Java.util.StringTokenizer;
class stringtoken{
public static void main (String args[]){
String s1 = "StringTokenizer|by|Himal";
StringTokenizer stt = new StringTokenizer(s1,"|");
while (stt.hasMoreTokens()){
String token = stt.nextToken();
System.out.println(token);
}
}
}
結果:
StringTokenizer
by
Himal
文字列をトークンに分割する方法を次に示します(トークンは1つ以上の文字です)
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String s = scan.nextLine();
s = s.replaceAll("[^A-Za-z]", " ");
StringTokenizer arr = new StringTokenizer(s, " ");
int n = arr.countTokens();
System.out.println(n);
while(arr.hasMoreTokens()){
System.out.println(arr.nextToken());
}
scan.close();
}
package com.Java.String;
import Java.util.StringTokenizer;
public class StringWordReverse {
public static void main(String[] kam) {
String s;
String sReversed = "";
System.out.println("Enter a string to reverse");
s = "THIS IS ASHIK SKLAB";
StringTokenizer st = new StringTokenizer(s);
while (st.hasMoreTokens()) {
sReversed = st.nextToken() + " " + sReversed;
}
System.out.println("Original string is : " + s);
System.out.println("Reversed string is : " + sReversed);
}
}
出力:
逆にする文字列を入力してください
元の文字列は次のとおりです。THISIS ASHIK SKLAB
逆の文字列は次のとおりです。SKLABASHIK IS THIS