NioCognode
@NioCognode

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Iterator.next() はなぜ最初の要素をスルーしないのでしょう?

Q&A

Closed

初めまして。
Java 初心者です。

以下のコードについて疑問があります。

Iterator<String> it = list.iterator();
while(it.hasNext()){
    String str = it.next();
}

next() メソッドは「次の要素を返す」と説明されています。
https://docs.oracle.com/javase/jp/6/api/java/util/Iterator.html)
しかし、これで最初の要素にアクセスできることに納得がいきません。
私の理解不足を補っていただけるような説明をお願いできますでしょうか。

0

4Answer

Iterator は下図のようにリストの境界を指すとイメージしてください。リスト先頭の境界の次にくる要素は最初の要素になります。

           v-- 次の要素
        +------+------+------+---
list =  |elem 0|elem 1|elem 2|...
        +------+------+------+---
        ^-- iter

                  v-- 次の要素
        +------+------+------+---
list =  |elem 0|elem 1|elem 2|...
        +------+------+------+---
               ^-- iter
4Like

これは、リンクの「次の要素を返す」に語弊がありますね
言い換えるなら、「現在の要素を返しつつ、位置を次に進める」と覚えてもらうのがよいと思います。
他の方が書いてくれたコードをもとに言えば、next()内のインクリメントが後置になっているのがポイントです

3Like

ライブラリのソースコードを読んでみることもできますよ。
依存関係を追うのが大変そうだったので、簡単な実装をしてみました。
理解の助けになりましたら幸いです。

import java.util.List;
import java.util.Arrays;

class MyIterator<T> {
    private final List<T> source;
    private int index = 0;

    MyIterator(List<T> source) {
        this.source = source;
    }

    boolean hasNext() {
        return index < source.size();
    }

    T next() {
        return source.get(index++);  // 要素を取り出した後にindexを進める
    }
}

class MyList<T> {
    private final List<T> items;

    MyList(List<T> items) {
        this.items = items;
    }

    MyIterator iterator() {
        return new MyIterator(items);
    }
}

public class Main {
    public static void main(String[] args) {
        MyList<String> list = new MyList(Arrays.asList("a", "b", "c"));
        MyIterator it = list.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
    }
}
1Like

質問者です。

回答ありがとうございました。
next() という字面に引っ張られすぎていたようです。
お陰様で見解を改めることができました。
モヤモヤが失せてとても気分がいいです、ありがとうございました。:smiley:

0Like

Your answer might help someone💌