6

特定のイテラブル (このIterableString クラスなど) では、新しいイテレータが作成されるか、イテレータが新しい foreach コンストラクトごとに何らかの方法で最初にリセットされることに気付いたと思いますが、これは他のイテラブルでは発生しないようです...

たとえば、次のコードを実行するとします。


import java.util.ArrayList;


public class test {


  public static void main(String args[]) {
    IterableString x = new IterableString("ONCE");

    System.out.println("***");
    for (char ch : x){
      System.out.println(ch);
    }

    System.out.println("***");
    for (char ch : x){
        System.out.println(ch);
     }

    ArrayList y = new  ArrayList();
    y.add('T');
    y.add('W');
    y.add('I');
    y.add('C');
    y.add('E');

    System.out.println("***");
    for (char ch : y){
        System.out.println(ch);
     }

    System.out.println("***");
    for (char ch : y){
        System.out.println(ch);
     }

    System.out.println();
  }
}

次の出力が表示されます。


***
O
N
C
E
***
***
T
W
I
C
E
***
T
W
I
C
E

x を使用した 2 番目の foreach ループは、中断した場所 (最後の項目の後) から開始するように見えますが、y を使用した 2 番目の foreach ループは、最初に開始した場所 (最初の項目) から開始するようです。これはなぜですか? また、後者のように動作する Iterables (ArrayLists) を作成するにはどうすればよいでしょうか?

より具体的には、IterableString のようなクラスを ArrayList のように機能させるには、どのように正確に変更すればよいでしょうか?

4

2 に答える 2

5

クラス(リンクされた記事IterableStringで定義されている)は、との両方です。それが良い考えであるかどうかは議論の余地がありますが、簡単な修正は次のとおりです。IterableIterator

  // This method implements Iterable.
  public Iterator<Character> iterator() {
    return new IterableString(this.str);
  }
于 2012-12-21T01:26:06.110 に答える
-1

Anは、JavaでインターフェースをArrayList実装しているため、Javaforeachループで繰り返すことができます。インターフェイスは、コレクションのイテレータを返すメソッドIterableの概要を示しています。Javaでforeachループを使用すると、内部でこのメソッドのイテレータが使用されます。新しいforeachループを作成するたびに、は新しいイテレータを提供します。IterableiteratorArrayList

Javaでforeachループを使用して反復できるクラスを作成する場合は、Iterableインターフェースを実装し、コレクションを反復する方法を定義する必要があります。

于 2012-12-21T01:25:56.347 に答える