- PR -

JSPよりStringTokenizerを使う方法

投稿者投稿内容
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2004-03-03 16:48
引用:

hasMoreTokens()してtrueならば、初めてnextToken()が呼べます。
つまり、taroさんのおっしゃる様に、いちいちnextToken()する前にhasMoreTokens()して
trueかどうか調べないとダメです。



引用:

という形式でhasMoreTokens()とnextToken()の呼び出しをペアにしないとダメです。



ResultSet かなにかと勘違いされているような...。

この場合ですと毎回 hasMoreTokens() を呼ぶなんてことをせずに countTokens() が 3(以上)を返すかどうかを調べれば済む話ではないでしょうか。
みーちく
大ベテラン
会議室デビュー日: 2002/08/29
投稿数: 131
投稿日時: 2004-03-03 17:39
みーちくです。

おばけさん、びしばしさん
返信ありがとうございます。

引用:

whileループに入る直前のトークンの状態しかチェックしていません。
一度チェックしたあと三回連続でnextToken()を呼んでいますよね?
ですが、最初にwhile文の条件判定で行ったhasMoreTokens()のチェックでは、一番上の
dir_nameに値を代入する際に実行されるnextToken()でトークンが取得できることしか
保証できていません。


おばけさん。
丁寧な説明ありがとうございます。
私はすごく勘違いしておりました。これで、ようやく納得できました。

引用:

この場合ですと毎回 hasMoreTokens() を呼ぶなんてことをせずに countTokens() が 3(以上)を返すかどうかを調べれば済む話ではないでしょうか。


びしばしさん。
そういうチェックのやり方もあったのですね。
勉強になりました。

皆様、ありがとうございました。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-03-03 18:14
問題が解決されたようですが、ここで一つクイズを

問題:
次のように、StringTokenizerで文字列中の全てのトークンを取り出す場合、
もっとも効率がよいのはどれ?

コード:
// 1
StringTokenizer st = new StringTokenizer(input);
while (st.hasMoreElements()) { 
	String token = st.nextToken();
	...
}

// 2
StringTokenizer st = new StringTokenizer(input);
int n = st.countTokens();
for (int i = 0; i < n; i++) {
	String token = st.nextToken();
	...
}

// 3
StringTokenizer st = new StringTokenizer(input);
while (st.countTokens() > 0) {
	String token = st.nextToken();
	...
}


unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-03-03 18:32
unibon です。こんにちわ。
#チャチャですが。

引用:

Wataさんの書き込み (2004-03-03 18:14) より:
問題:
次のように、StringTokenizerで文字列中の全てのトークンを取り出す場合、
もっとも効率がよいのはどれ?


解答:
どれも(開発)効率が悪い。

私は StringTokenizer を使って一発でうまくいったためしがないので、地道に String.indexOf などを使って自前で解析したほうがまだ良いのでは、と考えています。


処理効率なら 1 ? ん?ヒッカケか?
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2004-03-03 19:30
4. String#split() を使う。

ってのは問題の前提条件に沿いませんか、そうですか
おばけ
ぬし
会議室デビュー日: 2002/11/14
投稿数: 609
お住まい・勤務地: 東京都江東区
投稿日時: 2004-03-03 19:33
引用:

この場合ですと毎回 hasMoreTokens() を呼ぶなんてことをせずに countTokens() が 3(以上)を返すかどうかを調べれば済む話ではないでしょうか。


あ、そういうやり方もありますね。
いっつもwhile(st.hasMoreTokens())...って感じのコードを書いてたので、気付き
ませんでした。というか、StringTokenizer最近あまり使わないです(言い訳)
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2004-03-04 09:41
Wataです。
引用:

unibonさんの書き込み (2004-03-03 18:32) より:
解答:
どれも(開発)効率が悪い。


引用:

びしばしさんの書き込み (2004-03-03 19:30) より:
4. String#split() を使う。


まったく同感です
Tigerならjava.util.Scannerを使うのもいいかも
# まだ使ったことないけど...

いちおう、答えですが

私の環境でのあてにならないマイクロベンチ-マークテストの
結果では1が最もはやいです。
しかし、2との差は(トークンの総数がとてつもなく大きくない限り)
無視できるので、コードが見やすくなるほうを使ってください。
また、2はループの中でデリミタの変更が行われると破綻します。

3は2乗オーダーの計算量になるので、トークン総数が多くなると
致命的な遅さを発揮するので、絶対にやらないで下さい。

以上です。ひねりがなくてスイマセン...
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-04 13:32
私が知っている、テキストで保存したデータのパースのやり方を挙げて
おきます。

1.java.text.MessageFormat#parse()を利用する。
2.java.util.regexpパッケージその他の正規表現ライブラリを利用する。
3.JavaCCを使ってパーサを書く。
4.XML形式でテキストデータを記述して、パース処理はXMLパーサ等に任せる。

個人的には、最近はバインディングフレームワークを利用して4にしてしま
うことが多いです。お勧めです。

1は、C言語のsscanf()と似たような機能を提供していますので、意外と適
用範囲が広いですよ。

スキルアップ/キャリアアップ(JOB@IT)