用于自定义类项列表的循环迭代器/生成器

Evu*_*sas 3 java iterator generator

假设我有一个自定义类:

public class CustomClass {
    private String name;
    private String data;

    public CustomClass(String name, String data) {
        this.name = name;
        this.data = data;
    }
}
Run Code Online (Sandbox Code Playgroud)

我还有一个自定义类对象的列表:

CustomClass[] list = new CustomClass[] {
    new CustomClass("Item 1", "data"),
    new CustomClass("Item 2", "data"),
    new CustomClass("Item 3", "data"),
    new CustomClass("Item 4", "data"),
    new CustomClass("Item 5", "data"),
};
Run Code Online (Sandbox Code Playgroud)

如何创建一个迭代器(或者更确切地说,生成器)来遍历列表 K 次(K > list.length),每次都给我下一个元素?

我更喜欢“内联”解决方案(不创建任何新类)。

说,我需要一个接一个地获取我的 CustomClass 列表项 K = 7 次。解决方案应该按照 CustomClass 对象检索我:

  • 第 1 项
  • 第 2 项
  • 第 3 项
  • 第 4 项
  • 第 5 项
  • 第 1 项
  • 第 2 项

小智 5

使用索引模数组长度:

for( int i = 0; i < K; i++ ) {
   list[ i % list.length ];
}
Run Code Online (Sandbox Code Playgroud)

当涉及到i大于或等于列表长度的第一个索引(此处称为)时,它将“重置”它,因为操作 modulo ( %) 返回整数除法后的余数。

该解决方案不引入任何类。


小智 5

尝试这个。

static <T> Iterator<T> circularIterator(List<T> list, int count) {
    int size = list.size();
    return new Iterator<T>() {

        int i = 0;

        @Override
        public boolean hasNext() {
            return i < count;
        }

        @Override
        public T next() {
            return list.get(i++ % size);
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

List<String> list = Arrays.asList("a", "b", "c");
for (Iterator<String> i = circularIterator(list, 5); i.hasNext();) {
    String s = i.next();
    System.out.println(s);
}
Run Code Online (Sandbox Code Playgroud)

结果:

a
b
c
a
b
Run Code Online (Sandbox Code Playgroud)