6

我相信我已经注意到,对于某些 Iterables(例如这个IterableString 类),要么创建了一个新的迭代器,要么迭代器以某种方式在每个新的 foreach 构造中重置为开头,但这似乎不会发生在其他 Iterables 中......

例如,如果您运行以下代码:


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 的第二个 foreach 循环似乎从它停止的地方开始(在最后一项之后),但是带有 y 的第二个 foreach 循环似乎从它第一次开始的地方(在第一项)开始。为什么会这样?我们如何才能让 Iterables 表现得像后者(ArrayLists)?

更具体地说,我们将如何修改像 IterableString 这样的类以像 ArrayList 一样工作?

4

2 回答 2

5

该类IterableString(由您的链接文章定义)既是Iterable又是Iterator。这是否是一个好主意是有争议的——但一个简单的解决方法是:

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

AnArrayList能够在 java foreach 循环中被迭代,因为它Iterable在 Java 中实现了接口。该Iterable接口概述了一个iterator返回集合迭代器的方法。在 Java 中使用 foreach 循环在后台使用此方法中的迭代器。每次创建新的 foreach 循环时,ArrayList都会提供一个新的迭代器。

如果要创建一个可以在 Java 中使用 foreach 循环进行迭代的类,则需要实现Iterable接口并定义如何迭代集合。

于 2012-12-21T01:25:56.347 回答