2011-09-14 3 views
2

System.out.printlnを使用して、次のメソッドを呼び出した後にベクトルのサイズを表示すると、文字列パラメータが "7455573;photo41.png;photo42.png"なので2と表示されますが、1が表示されます。なぜこのベクトルのサイズは1ですか?

private void getIdClientAndPhotonames(String csvClientPhotos) 
{ 
    Vector vListPhotosOfClient = new Vector(); 
    String chainePhotos = ""; 
    String photoName = ""; 
    String photoDirectory = new String(csvClientPhotos.substring(0, csvClientPhotos.indexOf(';'))); 

    chainePhotos = csvClientPhotos.substring(csvClientPhotos.indexOf(';')+1); 
    chainePhotos = chainePhotos.substring(0, chainePhotos.lastIndexOf(';')); 
    if (chainePhotos.indexOf(';') == -1) 
    { 
     vListPhotosOfClient.addElement(new String(chainePhotos)); 
    } 
    else // aaa;bbb;... 
    { 
     for (int i = 0 ; i < chainePhotos.length() ; i++) 
     { 
      if (chainePhotos.charAt(i) == ';') 
      { 
       vListPhotosOfClient.addElement(new String(photoName)); 
       photoName = ""; 
       continue; 
      } 
      photoName = photoName.concat(String.valueOf(chainePhotos.charAt(i))); 
     } 
    } 
} 

だから、ベクトルは、2つの文字列photo41.png and photo42.pngが含まれている必要がありますが、私はベクターコンテンツを印刷するとき、私は唯一のphoto41.pngを取得します。

私のコードで何が間違っていますか?

+0

コードをステップ実行するためにデバッガを使用しようとしましたか? –

+0

'addElement'がなぜ2度目に呼び出されないのかを知るために、ブレークポイントで行ごとのデバッグを試みましたか?それは通常問題を理解するのに役立ちます。 –

+0

なぜsipmlyを使用しないのですか?csvClientPhotos.split( ";"); – stacker

答えて

1

これらの2行は問題である:最初のものはchainePhotos"photo41.png;photo42.png"を含むが、第二の一つは、それphoto41.pngなる後

chainePhotos = csvClientPhotos.substring(csvClientPhotos.indexOf(';') + 1); 
chainePhotos = chainePhotos.substring(0, chainePhotos.lastIndexOf(';')); 

- ベクターに唯一の要素でメソッドを終了した場合trigersれます。

EDITED:何が混乱しますか。

  1. 正しい入力(OPによって提供された)でそれを実行し、上記のコメントをしました。
  2. 誤って入力を7455573;photo41.png;photo42.png;に変更している間に上記のように修正しましたが、誤っていて入力上の説明と一致しない可能性があります。

私は誰かがこれを解答することを望みます。

+1

@Andy、あなたは本当に答えを受け入れる前に試してみるべきです:-)ベクトルは_still_に1つのエントリしか持たないでしょう。 – paxdiablo

+0

ええ、私はちょうど入力としてそれを気づいた。しかし、私はそれを '' 7455573; photo41.png; photo42.png; "'入力として(誤って:))実行しました。これは入力として論理的に見えます。 – ZenMaster

4

2件すぐに問題があります。

最初は文字列の最初の操作です。二行:

chainePhotos = csvClientPhotos.substring(csvClientPhotos.indexOf(';')+1); 
chainePhotos = chainePhotos.substring(0, chainePhotos.lastIndexOf(';')); 

7455573;photo41.png;photo42.pngに適用あなたphoto41.pngを与えることになります。最初の行は最初;7455573;)にすべてを除去し、第二は、以降最終;;photo42.png)からすべてを取り除きためだ

7455573;ビットを取り除くつもりならば、2行目は必要ありません。

この問題のみを解決してもすべての問題が解決されるわけではないことに変わりはありません。 (ループに)あなたの入力文字列が正しいphoto41.png;photo42.pngですが

、あなたはまだだけベクトルにあなたが区切り ;遭遇するたびにアイテムを追加します。その文字列の最後に のような区切り文字があります。つまり、最後の項目は追加されません。

あなたはforループの直後置くことによってこの問題を解決することができます

if (! photoName.equals("")) 
    vListPhotosOfClient.addElement(new String(photoName)); 

;で終端されていない最終的な名前の場合をキャッチします。それはのjava-私に再びタグ付けされているため

4

答えは、もうこの質問には有効ではありません。 Javaの場合(最初と同じように)はまだ真です:csvファイルを処理する必要がある場合はString#splitを使用してください。


文字列を分割してはるかに容易になります:

String[] parts = csvClientPhotos.split(";"); 

これは、文字列の配列を与える:

{"7455573","photo41.png","photo42.png"} 

その後、あなたは、単にあなたのベクトルにparts[1]parts[2]をコピーすると思います。

+1

問題はJava j2meを使用していて、エディタ(Sun Java ME SDK 3)で分割方法が表示されないことです。 –

+0

問題は、*間違ったタグを使用したことです。あなたは明らかにJavaを求めました。 –

+0

彼はJava MEにはっきりとタグ付けされています。 'string.split'はJava MEでは利用できません。 – bharath

0

手動で文字列を分割できます。 ;記号の文字列がこのようにできる理由を意味していますか?このようにしてください。

private void getIdClientAndPhotonames(String csvClientPhotos) 
{ 
    Vector vListPhotosOfClient = split(csvClientPhotos); 
} 

private vector split(String original) { 
Vector nodes = new Vector(); 
String separator = ";"; 
// Parse nodes into vector 
int index = original.indexOf(separator); 
while(index>=0) { 
nodes.addElement(original.substring(0, index)); 
original = original.substring(index+separator.length()); 
index = original.indexOf(separator); 
} 
// Get the last node 
nodes.addElement(original); 
return nodes; 
} 
関連する問題