イテレータとイテラブルの違いは何ですか?


195

私はJavaの初心者で、イテレータとイテラブルとは本当に混乱しています。誰かが私に説明していくつかの例を挙げられますか?

回答:


199

Iterable巡回できない一連の要素の簡単な表現です。「現在の要素」などの反復状態はありません。代わりに、を生成するメソッドが1つありIteratorます。

An Iteratorは反復状態のオブジェクトです。使用している要素が他にあるかどうかを確認hasNext()し、次の要素(ある場合)に移動します。next()

通常、はIterable任意の数の有効なを生成できますIterator


イテレータIterableがあるinteralか、externalイテレータがあるか、またはそれらのいずれかを持つことが可能かどうかは問題になりますか?
sakhunzai 2015

90

の実装は、それ自体Iterableを提供するIteratorものです。

public interface Iterable<T>
{
    Iterator<T> iterator();
}

イテレーターは、一部のユーザーが(削除する機能はありますが)特権を割り当てずにデータのコレクションをループできるようにする簡単な方法です。

public interface Iterator<E>
{
    boolean hasNext();
    E next();
    void remove();
}

Javadocを参照してください。


16

理解を深めるために、特にArrayListに関する質問を例として回答します。

  1. Iterableインターフェースは、サブクラスに抽象メソッド「iterator()」を実装することを強制します。
public interface Iterable {
  ...
  abstract Iterator<T> iterator(); //Returns an 'Iterator'(not iterator) over elements of type T.
  ...
}
  1. イテレータインターフェイスは、サブクラスに抽象メソッド「hasNext()」と「next()」を実装するように強制します。
public interface Iterator {
  ...
  abstract boolean hasNext(); //Returns true if the iteration has more elements.
  abstract E next();          //Returns the next element in the iteration.
  ...
}
  1. ArrayListはListを実装し、ListはCollectionを拡張し、CollectionはIterableを拡張します。つまり、次のような関係を確認できます。

    '反復可能<-コレクション<-リスト<-ArrayList'

。そして、Iterable、Collection、Listは抽象メソッド 'iterator()'を宣言するだけで、ArrayListだけで実装します。

  1. 詳細については、次のように 'iterator()'メソッドを使用してArrayListソースコードを表示します。

'iterator()'メソッドは、 'Iterator'を実装するクラス 'Itr'のオブジェクトを返します。

public class ArrayList<E> ... implements List<E>, ...
{
  ...
  public Iterator<E> iterator() {
              return new Itr();
  }


  private class Itr implements Iterator<E> {
          ...

          public boolean hasNext() {
              return cursor != size;
          }
          @SuppressWarnings("unchecked")
          public E next() {
              checkForComodification();
              int i = cursor;
              if (i >= size)
                  throw new NoSuchElementException();
              Object[] elementData = ArrayList.this.elementData;
              if (i >= elementData.length)
                  throw new ConcurrentModificationException();
              cursor = i + 1;
              return (E) elementData[lastRet = i];
          }
          ...
  }
}
  1. 他のいくつかのメソッドまたはクラスは、イテレーター(Itr)を使用して、ArrayListなどのコレクションの要素を反復します。

これは簡単な例です。

public static void main(String[] args) {

    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    list.add("e");
    list.add("f");

    Iterator<String> iterator = list.iterator();
    while (iterator.hasNext()) {
        String string = iterator.next();
        System.out.println(string);
    }
}

さて、それは明らかですか?:)


すばらしい答えです。
Kavindu Dodanduwa

私はこの投稿を理解しましたが、この場合、戻り値の型がIterable<T>このシナリオであるメソッドを作成する場合、どのような手順を実装する必要がありますか?その例も提案してください。
Prasanna Sasne

12

コレクションが反復可能である場合、反復子を使用して反復できます(その結果、for eachループで使用できます)。反復子は、コレクションを反復処理する実際のオブジェクトです。


2
参考までに、java.util.Collectionは常にjava.util.Iterableを実装します。
Paul Draper

2
違いjava.lang.Iterableますか?
ulab 2016

それはjava.lang.Iterable
アルドク2018年

9

Iterableインターフェースを実装すると、オブジェクトを「foreach」ステートメントのターゲットにすることができます。

class SomeClass implements Iterable<String> {}

class Main 
{
  public void method()
  {
     SomeClass someClass = new SomeClass();
     .....

    for(String s : someClass) {
     //do something
    }
  }
}

イテレーターは、要素を反復するための実装を持つインターフェースです。Iterableは、Iteratorを提供するインターフェースです。


1
いずれかのクラスがIterableを実装している場合、その中にIterator()メソッドが含まれている必要がありますか?私が間違っていたら訂正してください。
Chinmaya B 2015

はい。インターフェースの実装されていないメソッドが必要です。この場合はIteratorです。
agent.smith 2015

インテリジェントな回答をありがとう。IterableとIteratorの理解を再確認するためにここに来ました。確認しました。他のすべての答えは構造について話しますが、私はそれで結構ですが、なぜ私が一方を他方で使用するのかという質問には答えません。
EricGreg、2016年

私にとっては、これが最良の答えです。
サム

String s:someClassのFor eachループの利点は何ですか?someClassはJavaクラスオブジェクトであり、sは文字列参照です。どのような状況下では、このような種類の実装を行う必要があります。
Neeraj

8

最も重要な考慮事項は、問題のアイテムを複数回トラバースできるようにするかどうかです。これは、iterator()を再度呼び出すことで常にIterableを巻き戻すことができますが、Iteratorを巻き戻す方法がないためです。


なぜコレクションクラスがIteratorインターフェイスを直接実装しないのか(Iterableを実装してIteratorオブジェクトを返すのではなく)。この回答は、その場合、コレクションを複数回(および複数のスレッドで同時に)トラバースすることは不可能であることを明らかにしました。これは非常に重要な答えです。
simpleDev

2

ここで説明するように、ループで使用できるように「反復可能」が導入されましたforeachIterableを実装するクラスインターフェースを反復することができます。

Iteratorは、Iterableの反復を管理するクラスです。現在のイテレーションの現在の状態を維持し、次の要素とは何か、そしてそれを取得する方法を知っています。


2

リンゴが10個ある例を考えてみましょう。Iterableを実装する場合、各リンゴを1から10のボックスに入れ、ナビゲートに使用できるイテレータを返すようなものです。

イテレータを実装することで、任意のリンゴ、次のボックスのリンゴなどを取得できます。

したがって、反復可能オブジェクトを実装すると、要素をナビゲートするためのイテレータが提供されますが、ナビゲートするには、イテレータを実装する必要があります。


1

質問:IterableとIteratorの違いは何ですか?
回答:

iterable:これはforEachループ
イテレーターに関連しています:Isはコレクションに関連しています

forEachループのターゲット要素は反復可能でなければなりません。
イテレータを使用して、コレクションからオブジェクトを1つずつ取得できます。

java.ḷangパッケージに存在するイテラブル
java.utilパッケージに存在するイテレーター

1つのメソッドのみを含むiterator()
3つのメソッドを含むhasNext()、next()、remove()

1.5バージョンで
導入1.2バージョンで導入


1

基本的には、両者は非常に密接に関連しています。

Iteratorを、hasNext()、next()、およびremove()などの未定義のメソッドを使用してコレクションをトラバースするのに役立つインターフェースであると考えてください

反対に、Iterableは別のインターフェイスであり、クラスによって実装されると、クラスが強制的にIterableになり、For-Each構成のターゲットになります。Iteratorインターフェイス自体に由来するiterator()という名前のメソッドは1つだけです。

コレクションが反復可能である場合は、イテレーターを使用して反復できます。

理解のためにこれらを訪問してください:

ITERABLE: http ://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/lang/Iterable.java

ITERATOR http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/Iterator.java


1

私はこれが古い質問であることを知っていますが、これを読んで同じ質問に悩まされ、すべての用語に圧倒される可能性のある人のために、イテラブルとイテレータのこの違いを理解するのに役立つ、簡単な類推を示します。

公共図書館を考えてみてください。古い学校。紙の本付き。はい、そのようなライブラリです。

本だらけの棚はイタラブルのようです。棚には長い本が並んでいます。何冊か分からないかもしれませんが、これは長い本のコレクションであることがわかります。

ライブラリアンはイテレーターのようなものです。彼はいつでも特定の本を指すことができます。彼は彼が指しているその場所で本を挿入/削除/修正/読むことができます。「次へ」と叫ぶたびに、彼は順番に各本を順番に指さします。彼に。したがって、通常は彼に「次はありますか?」と尋ねると、彼は「はい」と言い、それに「次へ」と言います。そして彼は次の本を指すでしょう。また、棚の最後に達したことも知っているので、「次はありますか?」と尋ねると、彼は「いいえ」と言うでしょう。

私はそれが少しばかげていることを知っていますが、これが役に立てば幸いです。


0

ColinDSeekerの回答に加えて。

簡単に言うと、IterableIteratorはどちらもJavaのコレクションフレームワークで提供されるインターフェースです。

反復可能

クラスがコレクションを反復するfor-eachループを必要とする場合、クラスはIterableインターフェースを実装する必要があります。ただし、for-eachループは、コレクションを順方向に循環するためにのみ使用でき、このコレクションの要素を変更することはできません。ただし、要素データを読み取ることだけが目的の場合、それは非常に単純であり、Javaラムダ式のおかげで、多くの場合1つのライナーになります。例えば:

iterableElements.forEach (x -> System.out.println(x) );

イテレータ

このインターフェイスを使用すると、コレクションを反復処理して、その要素を取得および削除できます。各コレクションクラスは、イテレータをコレクションの先頭に返すiterator()メソッドを提供します。反復可能性に対するこのインターフェースの利点は、このインターフェースを使用して、コレクション内の要素を追加、変更、または削除できることです。ただし、要素にアクセスするには、反復可能コードよりも少し多くのコードが必要です。例えば:

for (Iterator i = c.iterator(); i.hasNext(); ) {
       Element e = i.next();    //Get the element
       System.out.println(e);    //access or modify the element
}

出典:

  1. Java Doc Iterable
  2. Java Docイテレータ

0

Iterable Javaの各ループで使用するために導入されました

public interface Collection<E> extends Iterable<E>  

Iteratorの反復を管理するクラスですIterable。現在のイテレーションの現在の状態を維持し、次の要素とは何か、そしてそれを取得する方法を知っています。


SOへようこそ。いつでもここでツアーに参加することができます。そうすることで、回答がより役に立ち、クリーンになります。私たちの場合、質問は2つのクラスに関する説明を求めていますが、あなたの答えは物事を明確にするのではなく、かなり混乱しています。回答をより具体的にするために、既知/有効/認定されたソースからのスニペットを投稿しながら、参照を維持するようにしてください。
AntJavaDev
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.