- PR -

Stringの配列での空欄認識する方

投稿者投稿内容
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-06-01 15:20
お世話になってます。
質問ばかりですみませんが、よろしくお願いします。
Stringの配列で、空欄認識する方法を教えてください。

//カンマ区切りのTokenizerを作成
StringTokenizer st = new StringTokenizer(line, "|");

// データ数だけstring配列を作成
String data[] = new String[st.countTokens()];
int i = 0;

while (st.hasMoreTokens()) {
data[i] = st.nextToken();
i++;
}
System.out.println(data[0])

空欄の配列が抜かされる、、、
データ例:
|||0011|
|999||0011|

出力:
0011
999
1つ目の行の出力を、空欄にしたいのですが、空欄認識していないようです。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-06-01 15:30
StringTokenizerを使うとそうなります。
String#split(String regex)を使えば幸せになれるんじゃないかな。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-06-01 15:53
ごめんなさい、これでもダメですね。orz

自分で切り出すしかないかな。
こんな感じ。
コード:
String line = "|111|222|||333|;
int start = 0;
while (start < line.length()) {
    int end = line.indexOf('|', start);
    String token = line.substring(start, end);
    System.out.print("'" + token + "',");
    start = end + 1;
}
System.out.println();


実行結果 : '','111','222','','','333',

luckseed
常連さん
会議室デビュー日: 2006/05/23
投稿数: 24
投稿日時: 2006-06-01 18:20
splitならいけますよ。
splitは正規表現を利用しており、'|'は正規表現で特殊な意味を持つので、エスケープしてやる必要があるんです。

split("\\|");
とやってみて下さい。

詳しくは、java.util.regex.Patternのドキュメントを参照してください。
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-06-02 09:13
ありがとうございます。
String[] str = line.split("\\|",0);
で空欄認識することができました。
しかし、


データ:
|||00:11|
|999||00:11|
|999|||
で、str[2]の値『0011』(:を抜かした値)を取得したいのですが、エラーがでます。
System.out.println(str[2].substring(0,1) + str[2].substring(3,4));

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: 1
at java.lang.String.substring(String.java:1441)
at Sample.main(Sample.java:110)

下記の@〜B場合でもエラーが出ます。
Cではうまくいきます。

@System.out.println(str[2].substring(0,1));

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: 4
at java.lang.String.substring(String.java:1441)
at Sample.main(Sample.java:110)

ASystem.out.println(str[2].substring(0,2));

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: 2
at java.lang.String.substring(String.java:1441)
at Sample.main(Sample.java:110)

BSystem.out.println(str[2].substring(0,3));

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String ind
ex out of range: 3
at java.lang.String.substring(String.java:1441)
at Sample.main(Sample.java:110)
CSystem.out.println(str[2].substring(0));
なぜ値が取れないのか不明です。
よろしくお願いします。
Edosson
ぬし
会議室デビュー日: 2004/04/30
投稿数: 675
投稿日時: 2006-06-02 09:30
引用:

まなさんの書き込み (2006-06-02 09:13) より:

データ:
|||00:11|
|999||00:11|
|999|||
で、str[2]の値『0011』(:を抜かした値)を取得したいのですが、エラーがでます。
System.out.println(str[2].substring(0,1) + str[2].substring(3,4));


str[2]が本当に"00:11"かどうか、確認してみてください。
想馬
大ベテラン
会議室デビュー日: 2003/05/29
投稿数: 245
お住まい・勤務地: 神奈川・東京
投稿日時: 2006-06-02 09:33
String#substringの使い方とStringIndexOutOfBoundsExceptionをリファレンスで確かめてください。
例外の意味を理解しないで使っているといつまでもエラーに悩むことになりますよ。

単純にコロンを取り除きたいのであれば、Javaのバージョンが1.4以上であればString#replaceAllを使うのが簡単です。
1.3以下であれば文字列にコロンがあるかをString#indexOf等で調べて地道にやるしかないと思います。
_________________
己への戒め

「活動的な馬鹿より恐ろしいものはない」 by ゲーテ
まな
常連さん
会議室デビュー日: 2005/10/26
投稿数: 45
投稿日時: 2006-06-02 09:39
すみません、自己解決しました。
str[2]がNULLじゃないとき、という条件を付け忘れていました。

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