- 締切済み
ArrayListのイテレータについて
java初心者です. 以下のようなプログラム(かなり簡略化しています)で ArrayList<Integer> list =new ArrayList<Integer>(); list.add(new Integer(1)); Iterator it = list.iterator(); while(it.hasNext()){ it.next() if(Math.random()<0.5) list.add(new Integer(2));//50%の確率で"2"を追加 }; arraylistの「先頭からイテレータを使って呼び出していくのと同時に,後ろに50%の確率で"2"を追加していきたい」のですが, うまく動作しません.「」の中のような動作を行うには,どうすればいいでしょうか? よろしくお願いします.
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- 中村 拓男(@tknakamuri)
- ベストアンサー率35% (674/1896)
イテレータはイテレートしているコレクションが変更されると 使えなくなります。
- tsunemisan
- ベストアンサー率62% (5/8)
次のようなExceptionが出ました: Exception in thread "main" java.util.ConcurrentModificationException at java.util.AbstractList$Itr.checkForComodification(AbstractList.java:372) at java.util.AbstractList$Itr.next(AbstractList.java:343) at javaapplication1.JavaApplication1.main(JavaApplication1.java:29) Java Result: 1 並列に関係するみたいので詳しくは。。。2つのオビジェクとが一つのリストを扱うときの問題みたいです。 当たり前ですが、リストを読むのだけならたぶん問題ないんだと思うんですが。 ですがプログラム自体が意味不明なので、最終的に何をしたいのかわからないのでどう指摘したらいいか。。。 まあ Iteratorでなくてもリストを回れるので: for (int i = 0; i < list.size(); i++) { if (Math.random() < 0.5) { list.add(new Integer(2));//50%の確率で"2"を追加 } }
- teketon
- ベストアンサー率65% (141/215)
原則、Iteratorは取得元のCollection(この場合、ArrayList)に変更があった場合は、再取得です。 > if(Math.random()<0.5) list.add(new Integer(2));//50%の確率で"2"を追加 ですから、上記のコードを、1/2の確率でArrayListに追加したあと、 Iteratorの再取得を行います。 > if(Math.random()<0.5){ > list.add(new Integer(2)); > it = list.listIterator(list.size()-1); > } ListIterator、List.size()-1は、指定したIndex位置からのIteratorの取得を行います。
- wormhole
- ベストアンサー率28% (1626/5665)
「うまく動作しません.」というのは、具体的にどううまくいかないのですか?