【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言

こんにちは 今アレイリストの二次元配列を学習しています
DBからデータを取得で表示したいと思っています

そこでfor文の拡張とつかうとうまくいうのですが
普通に記述するとうまくいきません

拡張FOR 文を使うのは初めてなので 何が違うかアドバイスお願いします

コンパイルできません↓

if(request.getAttribute("list")!=null || request.getAttribute("list1")!=null || request.getAttribute("list2")!=null){

ArrayList<ArrayList> hai = new ArrayList<ArrayList>();

ArrayList list = (ArrayList)request.getAttribute("list");
if (list != null) {
hai.add(list);
}

ArrayList list1 = (ArrayList)request.getAttribute("list1");
if (list1 != null) {
hai.add(list1);
}

ArrayList list2 = (ArrayList)request.getAttribute("list2");
if (list2 != null) {
hai.add(list2);
}


for (int i = 0; i < hai.get(0).size(); i++) {

%>
<table border="3">
<tr>

<%

for (int k = 0 ; k <= hai.size(); k++) {
%>
<td width="60">
<%
out.print(hai.get(i));

}
%>


コンパイルOK 表示できています

<%
if(request.getAttribute("list")!=null || request.getAttribute("list1")!=null || request.getAttribute("list2")!=null){

ArrayList<ArrayList> hai = new ArrayList<ArrayList>();

ArrayList list = (ArrayList)request.getAttribute("list");
if (list != null) {
hai.add(list);
}

ArrayList list1 = (ArrayList)request.getAttribute("list1");
if (list1 != null) {
hai.add(list1);
}

ArrayList list2 = (ArrayList)request.getAttribute("list2");
if (list2 != null) {
hai.add(list2);
}


for (int i = 0; i < hai.get(0).size(); i++) {

%>
<table border="3">
<tr>

<%

for (ArrayList list4 : hai) {
%>
<td width="60">
<%
out.print(list4.get(i));

}
%>
<br>
</tr>
</table>
<%



上のソースの エラーメッセージ
2013/04/16 9:24:12 org.apache.catalina.core.ApplicationDispatcher invoke
致命的: サーブレット jsp のServlet.service()が例外を投げました
java.lang.IndexOutOfBoundsException: Index: 2, Size: 2

よろしくお願いします

A 回答 (4件)

同じにはなりません。


#2を訂正して書きます

for (ArrayList list4 : hai) {
だと
list4=hai.get(0)
list4=hai.get(1)
list4=hai.get(2)
...
list4=hai.get(k)
...
list4=hai.get(hai.size()-1)
というループになります。

out.print(list4.get(i));

out.print(hai.get(0).get(i));
out.print(hai.get(1).get(i));
out.print(hai.get(2).get(i));
...
out.print(hai.get(k).get(i));
...
out.print(hai.get(hai.size()-1).get(i));
になります。

for (int k = 0 ; k < hai.size(); k++) {
out.print(hai.get(i));
}
との違い、わかりますね?

a=hai.get(i)
としたときに、aがどんなクラスになるか考えてください。
    • good
    • 0
この回答へのお礼

for (int i = 0; i < hai.get(0).size(); i++) {

%>
<table border="3">
<tr>

<%

for (int k = 0 ; k < hai.size(); k++) {

%>
<td width="60">
<%
out.print(hai.get(k).get(i));


}
%>
<br>

という風にするとコンパイルでき表示することができました。
()と[] get など組み合わせがまずかったんですね・・・
勉強不足でした
何度もありがとうございます

お礼日時:2013/04/16 14:11

あ、そっか。

ArrayListだから
hai[X]→hai.get(X)
でした。
    • good
    • 0
この回答へのお礼

そうなると一番最初にもどってしまいますよね><

やっぱりiterator使って
取得していくしかないですかね??

拡張for文をつかうの楽なのはわかったんですが、拡張for文があまり理解できていないのに、つかっていいのかなぁ・・・と思ったのと、勉強のために
for文で書きたいと思ってるんですが、

お礼日時:2013/04/16 13:02

k<=とk<をなおした上で。



「二つのプログラムが、同じ内容ではないから」


for (ArrayList list4 : hai) {
だと
list4=hai[0]
list4=hai[1]
list4=hai[2]
...
list4=hai[k]
...
list4=hai[hai.size()-1]
というループになります。

out.print(list4.get(i));

out.print(hai[0].get(i));
out.print(hai[1].get(i));
out.print(hai[2].get(i));
...
out.print(hai[k].get(i));
...
out.print(hai[hai.size()-1].get(i));
になります。

for (int k = 0 ; k < hai.size(); k++) {
out.print(hai.get(i));
}


との違い、わかりますね?
    • good
    • 0
この回答へのお礼

ありがとうございます

勉強になりました。
よんでから作成してみました

for (int i = 0; i < hai.get(0).size(); i++) {



for (int k = 0 ; k < hai.size(); k++) {
out.print(hai[k].get(i));

}

という風にしてみたのですが・・・
エラーがでます・・・
kの値は0~sizeー1
という風にしているのですが
コンパイルエラーがでます
hai[k]という風にはつかえないようです。
二次元配列やアレイリストをもっと勉強しなくてはいけませんね><
アドバイスありがとうございます!!
またよければアドバイスください

お礼日時:2013/04/16 11:47

中途半端な部分が引用されているのでわかりにくいのですが、


上のソースの
 for (int k = 0 ; k <= hai.size(); k++) {
  ……
 }

 for (int k = 0 ; k < hai.size(); k++) {
  ……
 }
なのでは?

バグがある部分をエラーメッセージから推測できるようになると
さらに進歩できると思います。

この回答への補足

返信ありがとうございます。
そちらもためしたのですが エラー内容はかわりませんでした。
拡張for文となにが違うか模索中です・・・

補足日時:2013/04/16 10:21
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!