- PR -

LinkedHashMapにArrayListを格納できない?

投稿者投稿内容
やまと
常連さん
会議室デビュー日: 2004/02/20
投稿数: 25
投稿日時: 2004-03-17 21:36
お世話になっています。

LinkedHashMapがうまく扱えず困っています。
ご教授願います。

LinkedHashMapのkeyとvaluesにArrayList で作成したオブジェクトはputできないんでしょうか。
以下ソースです。
----------------------------------------------------------------------------------------

Map sankaMap = new LinkedHashMap();
while (.....) {
//格納用配列araylistの生成
ArrayList tntActual = new ArrayList();

TournamentBean tntInf = new TournamentBean();

tntInf.setId(rsetTntDate.getString("id"));
tntInf.setTntDt(rsetTntDate.getString("tnt_dt"));
tntInf.setPlace(rsetTntDate.getString("place"));
tntInf.setStartTime(rsetTntDate.getString("st_time"));
tntInf.setEndTime(rsetTntDate.getString("ed_time"));
tntInf.setNearSt(rsetTntDate.getString("near_st"));
tntInf.setLevel(rsetTntDate.getString("level"));
tntInf.setRemarks(rsetTntDate.getString("remarks"));

//格納用配列のArrayListに1レコードを格納
tntActual.add(tntInf);

ArrayList memberActual = new ArrayList();
while (rsetSankaInf.next()) {
SankaActualBean member = new SankaActualBean();
member.setBackNumber(rsetSankaInf.getString("back_number"));
member.setJName(rsetSankaInf.getString("j_name"));
member.setSankaFlg(rsetSankaInf.getString("sanka_flg"));
member.setModDt(rsetSankaInf.getString("mod_dt"));

//格納用配列のArrayListに1レコードを格納
memberActual.add(member);
}
sankaMap.put(tntActual, memberActual);←←←←←←←←ここでエラーになります。


以下エラーの内容。
java.util.ArrayList
しかでません。

以上、宜しくお願いします。
}
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2004-03-17 22:24
こんばんはニシトミです。

put出来ると思いますけど

ソースを見てみると
while文の中で
tntActual、memberActual定義してますので
構文エラーなのかなと思います。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-17 22:25
引用:

やまとさんの書き込み (2004-03-17 21:36) より:
LinkedHashMapのkeyとvaluesにArrayList で作成したオブジェクトはputできないんでしょうか。



上記質問の答えとしては、「出来ます」 です。
エラーになるとの事ですが、原因は別にあると思います。
例外がスローされているんでしょうか?
発生する現象を具体的に書くと、解答を得られ易いと思います。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-17 22:38
引用:

ニシトミさんの書き込み (2004-03-17 22:24) より:
while文の中で
tntActual、memberActual定義してますので
構文エラーなのかなと思います。



下記のようなコードだと思われますので、大丈夫なのでは?
違っていたら、指摘してください。> やまとさん。
コード:

while (...) {
// 格納用配列araylistの生成
ArrayList tntActual = new ArrayList();

TournamentBean tntInf = new TournamentBean();

tntInf.setId(rsetTntDate.getString("id"));
tntInf.setTntDt(rsetTntDate.getString("tnt_dt"));
tntInf.setPlace(rsetTntDate.getString("place"));
tntInf.setStartTime(rsetTntDate.getString("st_time"));
tntInf.setEndTime(rsetTntDate.getString("ed_time"));
tntInf.setNearSt(rsetTntDate.getString("near_st"));
tntInf.setLevel(rsetTntDate.getString("level"));
tntInf.setRemarks(rsetTntDate.getString("remarks"));

// 格納用配列のArrayListに1レコードを格納
tntActual.add(tntInf);

ArrayList memberActual = new ArrayList();
while (rsetSankaInf.next()) {
SankaActualBean member = new SankaActualBean();
member.setBackNumber(rsetSankaInf.getString("back_number"));
member.setJName(rsetSankaInf.getString("j_name"));
member.setSankaFlg(rsetSankaInf.getString("sanka_flg"));
member.setModDt(rsetSankaInf.getString("mod_dt"));

// 格納用配列のArrayListに1レコードを格納
memberActual.add(member);
}
sankaMap.put(tntActual, memberActual);
}



関係無いかもしれませんが・・・。
トーナメント:参加者 = n:n のデータ構造ってことでいいんですよね?

[ メッセージ編集済み 編集者: でゅうく 編集日時 2004-03-17 22:44 ]
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2004-03-17 22:42
うわホントだ
while (rsetSankaInf.next()) {
うっかり見落としてました。
失礼しました
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-03-18 01:29
スコープの問題では?
tntActualはwhileの中で宣言した後、
whileの外で参照することはできないと思います。
そもそもコンパイルは通りましたか?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-18 14:24
引用:

やまとさんの書き込み (2004-03-17 21:36) より:

以下エラーの内容。
java.util.ArrayList
しかでません。




それは、スタックトレースの表示ではないですよね?
どうやってエラーの箇所を特定したのでしょうか?
やまと
常連さん
会議室デビュー日: 2004/02/20
投稿数: 25
投稿日時: 2004-03-22 20:37
ニシトミさん、でゅうくさん、かつのりさん、シュンさん
返事が遅くなってしまい申し訳ありません。

みなさんのご指摘とおり、While無いでArrayListを生成していましたので、
Whileの外に出しました。

//大会情報格納用TreeMap
TreeMap sankaMap = new TreeMap();←←←←←TreeMapに変更しました

//格納用配列araylistの生成
ArrayList tntActual = new ArrayList();←←←←←←←← Whileの外で生成
ArrayList memberActual = new ArrayList();←←←←←←←

//取得可能な行数分だけループ
while (rsetTntDate.next()) {

TournamentBean tntInf = new TournamentBean();

tntInf.setId(rsetTntDate.getString("id"));
tntInf.setTntDt(rsetTntDate.getString("tnt_dt"));
tntInf.setPlace(rsetTntDate.getString("place"));
tntInf.setStartTime(rsetTntDate.getString("st_time"));
tntInf.setEndTime(rsetTntDate.getString("ed_time"));
tntInf.setNearSt(rsetTntDate.getString("near_st"));
tntInf.setLevel(rsetTntDate.getString("level"));
tntInf.setRemarks(rsetTntDate.getString("remarks"));

//格納用配列のArrayListに1レコードを格納
tntActual.add(tntInf);

// データベースへのアクセス
db.open();

//大会日付を元に参加テーブルとメンバーテーブルから情報を取得
StringBuffer selectSankaActual =
new StringBuffer(
"select "
+ "s.back_number as back_number,"
+ "m.j_name as j_name,"
+ "s.sanka_flg as sanka_flg,"
+ "s.mod_dt as mod_dt "
+ "from member m,sanka_actual s "
+ "where s.tnt_dt ='"
+ rsetTntDate.getString("tnt_dt")
+ "'and m.back_number = s.back_number "
+ " group by back_number"
+ " order by tnt_dt desc,back_number asc");

rsetSankaInf = db.getResultSet(selectSankaActual.toString());

while (rsetSankaInf.next()) {

SankaActualBean member = new SankaActualBean();

member.setBackNumber(rsetSankaInf.getString("back_number"));
member.setJName(rsetSankaInf.getString("j_name"));
member.setSankaFlg(rsetSankaInf.getString("sanka_flg"));
member.setModDt(rsetSankaInf.getString("mod_dt"));

//格納用配列のArrayListに1レコードを格納
memberActual.add(member);

}
sankaMap.put(tntActual, memberActual);←←←←←←←エラーになっていると思われる場所
}
しかし、やはり同じエラーになってしまいます。
エラーの判断は、

} catch (Exception e) {
request.setAttribute("msg1", "予期せぬエラーです:");
request.setAttribute("msg2", e.getMessage());
でJSPに投げています。そこで、java.util.ArrayList しかでませんでした。

>関係無いかもしれませんが・・・。
>トーナメント:参加者 = n:n のデータ構造ってことでいいんですよね?

やりたいことは、
@トーナメント情報取得
A@のトーナメントに該当する参加者を複数取得。
BTreeMapクラスのsankaMapに@、Aを格納し、KEYとVALUESの対応付ける。
CJSPで出力。
です。

デバックで確認したところ、
sankaMapには、大会2つまで格納(参加者も格納)後、
今回のエラーになっているみたいです。


なぜだか分かりません。教えていただけないでしょうか。

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