- ベストアンサー
JAVA言語 Iterator
■JAVAの課題をしています。 ArrayList lendList =(ArrayList)session.getAttribute("text"); Iterator it=lendList.iterator(); while(it.hasNext()){ Text text=(Text)it.next(); String mondai = text.getMondai(); String seikaiNo= text.getSeikaiNo(); ArrayList tlist = text.getTlist(); String kaisetu = text.getKaisetu(); } のMondai SeikaiNo Tlist Kaisetu の中にはそれぞれ文章が4つ入っています。 Iteratorでまわすと、全部でてしまうのですが、一つだけ取得するにはどうしたらよいでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
もうひとつ、アドバイスさせて頂きます。 そもそもの、設計が良くない事が問題を複雑にしています。 日常生活で考えてみてください。 問題集 └ 4択問題 ├問題文 ├正解番号 ├解説文 └選択肢 ├選択肢文0 ├選択肢文1 ├選択肢文2 └選択肢文3 という構成になっていないとおかしいはずです。 言葉で説明すると、 (1)問題集は、複数の問題から構成されている。 (1-1)問題集から番号を指定することで、1つの問題が取り出せる。 (1-2)問題集からキーワードを指定すると、その言葉を含んだ複数の問題が取り出せる。 (2)問題は、問題文,正解番号,解説文,選択肢の4つから構成されている。 (2-1)それぞれの項目は get問題文(), get正解番号(), ... で取り出せる。 (3)選択肢は、4つの選択肢文から構成されている。 (3-1)それぞれの選択肢文は番号を指定することで、1つが取り出せる。 となっているべきです。 現行のクラス設計が、問題集(多分Textクラス)から、直接、問題文や選択肢文が 取り出せるようになっているから、混乱しているのでしょう。 初心者の人が、陥りがちな部分で、複数のことを一回に実行しようとしているから、 解らなくなってしまうのです。 トップダウンに実装するなら、 問題集クラスから問題クラス(中身は空で良い)を取り出す部分からコーディング します。ボトムアップに実装するなら、 選択肢クラスを作り、そこから任意の選択肢文が取り出せるようになったら、 1つの問題から問題文,正解番号,解説文,選択肢を取り出せるようにコーディング していきます。 現行の設計のままで、上述(1-2)の検索機能を実装することを考えてみてください。 誰が実装を行っても、グチャグチャなコーディングになってしまいますよ。 前のQ&Aでも書いたように、○×問題も追加したくなるかもしれません。 そうすると、今の状態では殆ど最初から書き直しになります。 >私の授業では、サーブレットにリクエストを送り、モデルでデータベースを >読み込み検索、JSPで画面構成するといった流れで、勉強していたものですから、 >なかなか応用が利かないのです。 間違いがあります。 応用が利かないのではなくて、残念ながら基本が掛けているんです。 >にぶい人間でもありますし。 これも大いに勘違いされているようですが、Javaを習い始めて1ヶ月程度で このような複雑な問題のクラス設計がまともに出来る訳が無いのです。 自分がにぶいからできないのではなきて、経験不足だから出来ないだけです。 まずは、List,Mapの操作方法等、部分部分をマスターしていってください。 設計の前に、使い方をマスターしておきたいJavaの有益なクラスはいっぱいあります。
その他の回答 (3)
- ppiiyyoo
- ベストアンサー率0% (0/1)
いろんな人が丁寧に細かく指摘してくれているので理解していると思いますが、アドバイスを一つ。 javaだとかクラスがどうだという前に、プログラミングの考え方の問題です。疑問を持ち、洞察力を働かせましょう。 OOPは特にアイデンティティと抽象を重要視します。 上記例でそれを指摘するならばこうです。 iteratorを使う以上、反復するわけです。しかもイテレータはコンテナプログラミングの基本です。 つまり必要なだけ繰り返すということです。まわりすぎるとかそういう次元の話を出すこと自体へんなんです。(どなたか指摘されてますよね) キャスト一発とっても意味がないなら使うべきではありません。 ウチの新人を見ているようでつい口出ししました。 OOPに限りませんが、プログラミングは必然的にそのようになるという流れを重視して書いていくものです。
お礼
アドバイスありがとうございます。 経験者の方からのアドバイスはとくに重みを感じます。 確かにあなた様のおっしゃるとおりかもしれません。 あなた様や皆様からのアドバイスをもとに少しずつ進めていきましたところ 全てではありませんが、どことなくわかってまいりました。 今後もアドバイスをよろしくお願い致します。
- HarukaV49
- ベストアンサー率53% (48/89)
QNo.3582183でも回答したものですが、非常に不思議な感があります。 >■JAVAの課題をしています。 >ArrayList lendList =(ArrayList)session.getAttribute("text"); >Iterator it=lendList.iterator(); >while(it.hasNext()){ >Text text=(Text)it.next(); 本当にこれが課題なのですか? まず、課題の設問として、何が問われているのかも理解できません。 ですから、それを解答しようとして、どの部分の理解不足から正解に 辿り着けないのかを想定することができません。 冒頭に”不思議”と書いた意味は、 (1)まず、なぜArrayListにキャストしているのか理解できません。 (2)そして、なぜ今時Iteratorを使うのか理解できません。 (3)それに、なぜTextという様な不自然なクラス名になっているのか理解できません。 ということなのですが、とりあえず具体的な解説は省略します。 本題に入ります。 >Iteratorでまわすと、全部でてしまうのですが、一つだけ取得するにはどうしたらよいでしょうか? ここが、決定的に不思議な部分なので、ここをちょっと深くご自身で考えてみてください。 ”Iteratorでまわすと、全部でてしまうのです”と結論を書いておられるではないですか? まわすと全部でてしまうと解っているなら、まわさなければ良いという事ですよね? ”Iteratorでまわすと、全部でてしまう”と書いておられますが、 そもそも書かれているコードを見る限り、これでは何も出てこないはずです。 意味が解りますか? whileステートメント内で宣言したオブジェクトは、それを抜けた段階で消滅するからです。 何が出てきてしまっているのでしょうか? 何かが出てくるほうが問題です。 せめて、課題の設問を提示しましょう。 それから自分の答案を示して、そこで何が思った通りにならないのかを教えてください。
お礼
私がここで始めて質問させていただいた時にご回答してくださった方ですね。今回もご意見ありがとうございます。私の授業では、サーブレットにリクエストを送り、モデルでデータベースを読み込み検索、JSPで画面構成するといった流れで、勉強していたものですから、なかなか応用が利かないのです。にぶい人間でもありますし。前回の質問やこの度の質問もあいまいさや理解できない箇所が多くあるのはそのためかと思います。 その中でも、ご回答してくださって大変感謝しております。 今回のの課題ではクラスをいくつかつくっておりますので、なかなか説明しずらい中で質問させていただきました。これは反省しております。大変に失礼致しました。上記のアドバイスの通り冷静に考えてみます。 ありがとうございました。
- pcbeginner
- ベストアンサー率46% (261/560)
whileの中で4つ取ってるからじゃないの? 4つ取らないで1つだけ取れば良いのでは? (そういうことじゃない???) mondaiには4つの文章、seikaiNoにも4つの文章、… ってことかな。 そしたら、その中から指定された1つの文章を返すようなゲッターを実装するか、 4つの文章から1つの文章を取り出す機能を作れば良いのでは?
お礼
なるほど、考えてみればそうですよね。 ・・・・実に己に発想力がないかが身にしみました。 アドバイスをもとに改めて考えなおしてみます。 ご回答ありがとうございました。 これからも質問させていただいた際には何卒アドバイスを宜しくお願いいたします。
お礼
アドバイスとても助かりました。確かに基本が身についておりません。 今の自分のレベルではすごく無理なことをしていることもわかっておりました。しかし引き下がれない理由がございましたので、ここで何度も質問させていただきました。厳しい意見をおっしゃていましたが、まさにその通りでございます。しかしご回答してくださった方は承知ながらも、ここまでアドバイスしてくださいました。大変感謝しております。親切な方で本当に良かったです。これからも、このサイトで質問させていただくかとは存じますが、見かけた際には、今のクイズプログラムの続きだと思ってくださると幸いでございます。これからも何卒宜しくお願い申しあげます。