- PR -

キャストって言うんですかね??

投稿者投稿内容
ぼぼ
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 2006-05-22 02:25
こんにちは。
いつも利用させてもらい、大変助かっています。

javaの文法でしょうか?以前から気になってる事があります。
ちょっとややこしくなりますが・・。

例えば、
@SQLでAのデータを取る(10件取得)
Aこれを一つのdataクラスに格納してList型に格納する。
B@〜Aのループの間に一つのcolumデータからBのSQLで3件のデータを取得する。
CBのSQLの結果3件を同じdataクラスに格納同じLISTに格納する。

分かりやすく言えば一つのSQLで取得できなかった他のデータをループ中に
取得する(複数件)と言う事ですが。

この時@のSQLが他BのSQLで結果1件の時合計12件のListが結果として
残りますね。

for (int i=0;i<B.size();i++) {
Data data = new Data();
data.setAA(Bの結果);
data.setBB(@の結果.getBB());
..
list.add(data);
}
Bのロジックを書いてみました。
気になってるのはList型に格納する時なのですが、
こういう風にnewしてもBの3件目が全て反映してしまうんですよね。
だからlistにaddしてる分全く同じレコードが3件出来てしまいます。

あれってみなさんどうしてるのですか?

ちょっと、分かりづらいですか・・??
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-22 07:27
引用:

ぼぼさんの書き込み (2006-05-22 02:25) より:

あれってみなさんどうしてるのですか?
ちょっと、分かりづらいですか・・??


すみません、意味が良くわかりませんでした。
キャストというより、ボクシング、アンボクシングの問題... なんでしょうか?
何かそれ以外の問題のような気がするのですが...

引用:

data.setAA((3)の結果);
data.setBB((1)の結果.getBB());


この 「~ の結果」になっている部分、添え字か何かが付いていると思うのですが、
この時点での結果は正しいのでしょうか?

System.out.println でも何でも良いので出力して確認してみてください。
(デバッガがあるなら、デバッガで確認)

まず、「問題の切り分け」からしていきましょう。
list の部分が問題なのか、それ以前の問題なのかを切り分ける必要があります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
未記入
常連さん
会議室デビュー日: 2005/05/07
投稿数: 32
投稿日時: 2006-05-22 11:20
日本語でおk。

(3)だけなんて言わずに、全部を書いてくださいよ。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2006-05-22 12:51
良く分からないけど、ループカウンタに対応するものが取得できているか判断して、
取得できていなかったらカウンタをwhere(予想)に織り込んだSQLを作って再取得するのに、そうしていない…のかな?
単にロジックができていないだけな気が。
ところで「colum」ではなく「column」です。
ぼぼ
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 2006-05-23 08:34
返事が遅れました。

以前同期を取られてしまいかなり悩みました。
やり方は色々あるのでしょうが、かなり汚いソースになってしまうので・・。
皆さんがおっしゃるのは、ソースが間違ってるという事ですね。
ん〜・・、そうだったのかな〜?色々悩んでたんだけどな〜。

ぼくもBのsqlでnewしたdataクラスに入れれば、問題ないと思ってたんですが・・。
そもそもnewしなくてそのまま@のsqlのdataクラスに入れて次のデータに行く前に
list.add()すれば大丈夫だと思ってたんですが、これはアウトなんですね。

ん?ん?ちょっと分かりにくくなってきましたか?
ありがとうございました、勘違いという事ですね。
未記入
会議室デビュー日: 2006/03/28
投稿数: 18
お住まい・勤務地: 大阪
投稿日時: 2006-05-23 09:45
分からないのは、あなたの日本語と思考回路。

> 皆さんがおっしゃるのは、ソースが間違ってるという事ですね。
> ん〜・・、そうだったのかな〜?色々悩んでたんだけどな〜。
自分の望む挙動を実装できないのに、
こんな言葉が出てくるなんて信じられません。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-05-23 09:52
引用:

ぼぼさんの書き込み (2006-05-23 08:34) より:

皆さんがおっしゃるのは、ソースが間違ってるという事ですね。
ん〜・・、そうだったのかな〜?色々悩んでたんだけどな〜。


最も大事な部分の実装がないので、間違っているかどうかもわからないんですよ。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ぼぼ
常連さん
会議室デビュー日: 2005/05/29
投稿数: 45
投稿日時: 2006-05-23 14:10
あちこちでみますがこれさんあんたの言い方はムカつきます、消えてくれ。
おれが分からないのはあんたぶしつけな言い方、おれだけじゃなく他の人にも同じ様な言い方
してるよな、荒れるからあまり言いたくなかったが、どれだけおえらいのか知らんが、
くそだ〜あんた。

さて、ぼくが聞きたかったのは
for (int i=0; i<@の結果.size(); i++) {
 Data data1 = new Data();
 data1.setAA(@の結果);
 data1.setBB(@の結果);
 data1.setCC(@の結果);

 Bのsql(条件にdata1.getAA());
 for (int j=0;j<B.size();j++) {
  Data data = new Data();
  data.setAA(data1.getAA());
  data.setBB(data1.getBB());
  data.setCC(data1.getCC());
  data.setDD(Bの結果);
  data.setEE(Bの結果);
  ..
  list.add(data);
 }
}

とこんな感じなロジックだった場合、本来
  Data data = new Data();
  data.setAA(data1.getAA());
  data.setBB(data1.getBB());
  data.setCC(data1.getCC());
  data.setDD(Bの結果);
  data.setEE(Bの結果);
      ↓
  data1.setDD(Bの結果);
  data1.setEE(Bの結果);

でいいはずだと思ってたんですが、DD,EEはBの実行時にのみセットしてるしBが複数行
あったとしてもlist.add()してるのでAA〜CCはデータが変わらずにDD,EEだけ追加され、
都度一旦確定してるものだと思っていました。

でも結果は例えばBの取得結果が3件だった場合3件分のDD,EEが同じ(3件の最後のデータ)
ものlistに格納されてしまうんですよね。
キャストと言うのか?同期を取ってしまうというんでしょうか?

それで新しくnewしたものに入れ替えて〜・・という操作をしてました。
  Data data = new Data();
  data.setAA(data1.getAA());
  ..
このソースですとうまくいくようですが、
  Data data = (Data)list.get(i);
とセットで入れた時はそれも同期を取ってしまってたような気がします。
(同期というのは結果3件同じデータに反映されてしまった事を意味してます。)

javaでそんな決まり事があればお聞きしたかったんですが・・。
ちょっと分かりずらい表現ですが、投げ出したりしてすいませんでした。

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