- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Iteratorの使い方でこまっています。)
Iteratorの使い方で困っています
このQ&Aのポイント
- Iteratorの使い方で困っています。次のプログラムで自分の望んだ結果と違う動作をします。原因やもっと良い方法をご存知の方はいませんか。
- Iterator temp = itでは駄目なのでしょうか。また、何度もIteratorを生成すると処理が重くなる気がします。もっと良い方法はないのでしょうか。ご存知の方はいらっしゃいませんか。
- 私の環境は以下の通りです。OS: Microsoft Windows XP Professional SP2、開発環境:Eclipse 3.2.2、java: java version "1.4.2_13"
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
すみません。多少自信はありませんがお答えいたします。 for文内で Iterator temp = it; とするのは、一番最初にMainのコンストラクタで作ったlistに対して getInstanceを使用し取得したIteratorへの参照のコピーになります。 つまりitとtempはメモリ上でまったく同じ領域を指すことになります。 一番最初に、つまりfor文の最初のループでそのIteratorをたどり listの要素を最後まで出力することになります。その結果がabcです。 次に二度目のループでも同じく Iterator temp = it; を実行するわけですが、このときはすでにlistの末尾まで進んだIterator。 つまり一回目のループで利用したIteratorのitへの参照のコピーをtempで得ることになります。 ということはitはすでにlistの末尾まで行ってますから temp.hasNext() は以降falseとなり何も出力されず、ただ改行がされる。 ということで abc と空行が入るのだと思います。 解決方法については少し思いつきませんでした。すいません。 ただこの短いlistへのIterator程度でしたらGCもありますので そんなに負荷にならないと思います。 どうしても解決するのでしたら・・・。そうですね。 「Iteratorを拡張して末尾までいったらリストの先頭に戻るIterator」 でも作ってみてはどうでしょうか。 以上参考までにでした。
お礼
片岡です。 回答ありがとうございます。 >つまりitとtempはメモリ上でまったく同じ領域を指すことになります。 わかりやすい解説ありがとうございます。 初心者の私でも、とてもよく理解できました。 >ただこの短いlistへのIterator程度でしたらGCもありますので >そんなに負荷にならないと思います。 私は、何の根拠もなく負荷になると思っていました。ごめんなさい。 毎回、instance.getIterator()を呼び出す形にします。 >どうしても解決するのでしたら・・・。そうですね。 >「Iteratorを拡張して末尾までいったらリストの先頭に戻るIterator」 >でも作ってみてはどうでしょうか。 ご助言ありがとうございます。勉強してみます。 003br005eedさん、ありがとうございます。