質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

889閲覧

Iteratorインタフェースとfor loop

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/11/14 18:18

Javaに関して質問があります。

先日、IteratorとListIteratorについて学習しました。
しかし、今までは配列やリストに対してforループで十分事足りていたので、いまいちこれらの使い道がわかりません。

もちろんインデックスでアクセスできないようなデータ構造に対しては使うのでしょうが、
リストなどのデータ構造を扱う上でプロの方々はforループではなくIteratorを使うのでしょうか?

言い換えると、forループで十分事足りる場合、わざわざIteratorを使わなくてもよいのでしょうか?

回答よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

最近コーディングから離れてるので、世間とずれあるかもしれませんが。

forかiteratorの、どちらかで悩むとか検討することはないです。

配列かコレクションなら、検討することありますが、基本、要素の増減の有無で決まるので悩まないです。

で、どちらも拡張forを使うかな。

要素の抽出や変換だと、StreamAPIになるのかなあ。

拡張forがなかったころは、ArrayListと、わかっていても、iterater一択でしたね。

forは、インデックスアクセスなので、インデックスの変数(添字)を変更できるのが問題でわけわからんコードがたまにうまれますが、
iteraterは全件走査というのが、コードから読み取れるのが良い点かな。

投稿2018/11/15 00:00

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/15 00:57

迅速な回答、ありがとうございました!
guest

0

ベストアンサー

プロではないですが、わかる範囲で答えると、多くの場面で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/14 19:11

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/15 01:00 編集

詳細な回答、ありがとうございました。 特定の状況下でfor文を使うと、面倒なことが起きるのですね。 適切に使い分けていきたいです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問