“Java可编程文件”;“重置”;具有每个Foreach构造的迭代器

“Java可编程文件”;“重置”;具有每个Foreach构造的迭代器,java,arraylist,foreach,iterator,iterable,Java,Arraylist,Foreach,Iterator,Iterable,我相信我已经注意到,对于某些Iterables(比如这个),要么创建了一个新的迭代器,要么迭代器以某种方式重置为每个新的foreach构造的开始,但这似乎不会发生在其他Iterables中 例如,如果运行以下代码: import java.util.ArrayList; public class test { public static void main(String args[]) { IterableString x = new IterableString("ONC

我相信我已经注意到,对于某些Iterables(比如这个),要么创建了一个新的迭代器,要么迭代器以某种方式重置为每个新的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表现得像后者(ArrayList)


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

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


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

IterableString
(由您定义)既是
Iterable
又是
迭代器。这是否是一个好主意仍有争议,但一个简单的解决办法是:

  // This method implements Iterable.
  public Iterator<Character> iterator() {
    return new IterableString(this.str);
  }
//此方法实现Iterable。
公共迭代器迭代器(){
返回新的IterableString(this.str);
}

到底是什么??这个未知对象可能与迭代器的配置方式有关,
Iterable
的Javadoc似乎没有太多说明,以强制每个调用
iterator()
都返回一个新的
iterator
——但这似乎是JDK接受的做法(而且是合理的)。因此,它看起来像是一个由谁创建的
IterableString
的“bug”。这仍然不能解决OPs问题。你的评论@code Guru让我有点困惑。也许我误解了这个问题,但我概述了为什么ArrayList在foreach循环中具有这种行为,以及如何在用户定义的类中模拟这种行为。问题是为什么
IterableString
类的行为与
ArrayList
不同。谢谢!我被我在其他iterables中看到的类似问题甩了(比如嵌套迭代器类有另一个问题,需要考虑它在其外部类中更改组件时的状态意识)。出于某种原因,错误的一致性给我的印象是,与我所看到的非标准iterables中的碎片相比,ArrayList等iterables有一些特殊之处。