- - PR -
arrayタイプのデータを区切って表示
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-12-26 13:31
お世話になります。少しお知恵を拝借したく、宜しくお願い致します。
ArrayListに入っているStringタイプのデータを3つごとに出力したいのすが、 ちょっと正確に出力できないのです。 このコードは簡単にしたものですが・・・ <% ArrayList array=new ArrayList(); array.add("ひ"); array.add("ふ"); array.add("み"); array.add("よ"); array.add("いつ"); array.add("む"); array.add("なな"); array.add("や"); array.add("ここ"); array.add("と"); kai=0; int j=0; int i=0; while(j<array.size()/3.0) { %> <logic:iterate id="csvRow" collection='<%= array %>' offset="kai" length="3" indexId="x"> <<%= kai %>>[<%= x %>]<bean:write name="csvRow" /><br> <% i++; %> </logic:iterate> <br> <% j++; kai=i; } %> このようにすると1回目のループではkai=0でoffsetは0となり0から始まるのですが、 2回目のループではkai=3でoffsetは3となりindexは3から始まらずに再び0から 始まってしまうのです。offset="x"としてもやって見ましたが、前のグループの一番 最後と次のグループの一番最初が同じものを見てしまったりしてどうもうまく 表示できません。 | ||||
|
投稿日時: 2006-12-26 14:05
jspは分からんから、アルゴリズムだけ。
確認してないから、動くかどうかは分からん。 #てゆーか、最近Java触ってないから、コンパイルすら通るかどうか分からん。 [ メッセージ編集済み 編集者: かずくん 編集日時 2006-12-26 14:10 ] | ||||
|
投稿日時: 2006-12-26 14:08
ループしている箇所は logic:iterate と while と2つありますが、一回目、2回目とはどちらをさしているのでしょうか?
#コードをよく見れば分かるのかもしれませんが kai,j,i の初期化をループの外で行っているのでループを重ねる毎に値が変わって動作が変わっていくのは自然なことだと思います。 どの段階でどの変数がどのような値になっているかをよく観察して、また本来どの様な値であるべきなのか考えてみましょう。 | ||||
|
投稿日時: 2006-12-26 14:17
1回目、2回目というのはwhileループのことをさしています。
本来なら、 ひ ふ み よ いつ む なな や ここ と と表示させたいのです。しかし、offsetの値を1回目のwhileループのときしか 見ていないようで、2回目のループでもindexが0から見てしまいます。offsetは 3となっていますが、それを見ていません。 | ||||
|
投稿日時: 2006-12-26 14:52
「offset を見ていない」とは具体的にどういう意味ですか?
ところで、これ2重にループさせる必要あるでしょうか? 3回に1回 <br> を余分に出力する、という処理でも良さそうです。 | ||||
|
投稿日時: 2006-12-26 15:18
本来のプログラムはこれよりも複雑で記述しているのは現在の問題を簡単に説明
できるようにとシンプルにしたものです。なので、単純に何回目の時に <BR>を置く、という処理だけでは解決できないのです。 offsetを見ていないというのはoffsetはコレクションのどこからiterateし始めるかを 指定するのですが、whileループで2回目に<logic:iterateに来たとき、offsetは 3になっているのですが、実際は最初に指定した0となっていて、 indexも0,1,2という風に出力していまうのです。 実際に一番最初に記述したコードを動かしてみると分かると思いますが、 offsetは000、333,666となっているのにも関わらず indexは012、012、012、012と見ているのです。 indexは012、345、678、9となるはずだと思うのですが。。。 | ||||
|
投稿日時: 2006-12-26 16:15
index ってコード中にはでてこないのですが、どれを指しているのでしょうか?
変数 x のこと? 期待している値と、実際の値が違うことがわかっているのであれば、あとはどのタイミングで違ってきているかを調べると良いでしょう。 >offsetを見ていないというのはoffsetはコレクションのどこからiterateし始めるかを >指定するのですが、whileループで2回目に<logic:iterateに来たとき、offsetは >3になっているのですが、実際は最初に指定した0となっていて、 >indexも0,1,2という風に出力していまうのです。 何かを説明するときはなるべく短い文章に区切った方がわかりやすいですよ。 見直してみて3行以上ある文章があったら、細かく区切れないか検討することをオススメします。 正直私には何がわからないのかがわかりません。while 文の書き方なのか、変数の代入の仕方なのか、logic:iterate の使い方なのか。 本質的に何が問題となっているのかを見極めましょう。そのためにもコードをシンプルにするのは大事なことです。 >本来のプログラムはこれよりも複雑で記述しているのは現在の問題を簡単に説明 >できるようにとシンプルにしたものです。なので、単純に何回目の時に 説明するためであれば、まず単体でコンパイルが通るものにすると良いですね。 kai とか x とか宣言されていないようですから、このままでは動かないでしょう。 動かないコードを提示して「動かしてみると分かると思います」というのはちょっと回答者に負担が大きいかも。 まず JSP とか logic:iterate タグから離れてスタンドアロンの Java プログラムで同様のコードを書いてみてはいかがでしょう。 かずくん が既にシンプルでそのまま動きそうなコードを提示されていますから、それを元に JSP に落とし込むのもいいかもしれませんね。 [ メッセージ編集済み 編集者: インギ 編集日時 2006-12-26 16:20 ] | ||||
|
投稿日時: 2006-12-26 17:49
kai,j,iを宣言すれば、そのまま動きます。
私もどちらかというとjavaのコードの方が使いやすいので、かずくんから いただいたコードはすぐに頭に思い浮かぶことはできるのですが、JSPになると 頭を悩ませてしまいます。 >index ってコード中にはでてこないのですが、どれを指しているのでしょうか? >変数 x のこと? xのことです。xがindexの位置を示しているのでついindexと書いてしまいました。 最初のコードを実行すると <0>[0]ひ <0>[1]ふ <0>[2]み <3>[0]ひ ←※ <3>[1]ふ <3>[2]み <6>[0]ひ <6>[1]ふ <6>[2]み <9>[0]ひ <9>[1]ふ <9>[2]み と表示されます。 私の理解では<>はoffsetの値でその値はindexの始点を示す位置であるから <3>の時は[3]を見るという認識ですが、間違っていますか? >期待している値と、実際の値が違うことがわかっているのであれば、あとはどのタイミ>ングで違ってきているかを調べると良いでしょう。 →※のタイミングで違ってきているのは分かっているのですが、 解決策がでてこず、数日が経ちます。。。 |