プロではないですが、わかる範囲で答えると、多くの場面でforで事足りることは多いと思います。
しかし、Iteratorで処理するとわかりやすい場面があります。
要素の削除が必要な場合 - forでやると面倒
List内の要素をループで回しながら、条件によって要素を削除したり挿入したりしたいとします。
これをforでやろうとすると少々面倒です。こんなループを考えます。
java
1List<Integer> list = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5));
2for (int i = 0; i < list.size(); i++) {
3 int x = list.get(i);
4 if (x >= 3) {
5 list.remove(i);
6 }
7}
3以上の要素をすべて削除する意図のコードですが、実際に実行すると
[0, 1, 2, 4]
と、4が残ってしまいます。これは、
0. i = 3
で3が削除された後、要素が詰められて、listは[0, 1, 2, 4, 5]という状態になる。(要素4がインデックス3の位置にある状態)
0. ループのインクリメントによりi = 4
に。インデックス4の位置にある要素5が取り出され、削除される。
という具合に進むため、要素4がチェックされずスルーされてしまいます。
forでこれを避けるためには、削除したらデクリメントするなどの方法になりますが、本来このループ処理に関係ないデクリメントがコード上に現れるのは直感的ではありません。「削除した時の次のループでインクリメントしない」というような書き方も、forでやろうとすると非常に面倒です。
これをIteratorを使うと、その辺の処理が表に出てくることなく書くことができます。
java
1List<Integer> list = new ArrayList<>(Arrays.asList(0, 1, 2, 3, 4, 5));
2for (Iterator<Integer> it = list.iterator(); it.hasNext(); ) {
3 int x = it.next();
4 if (x >= 3) {
5 it.remove();
6 }
7}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/11/15 00:57