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

时间:2017-06-08 22:55:22

标签: java iterator generator

说我有一个自定义类:

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

    public CustomClass(String name, String data) {
        this.name = name;
        this.data = data;
    }
}

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

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"),
};

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

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

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

项目1 第2项 第3项 第4项 第5项 第1项 第2项

4 个答案:

答案 0 :(得分:4)

尝试使用索引模数组长度

with open(os.path.join(out_dir, 'extractedLinks.txt'), 'a+', encoding="utf8") as out_file:
    links = set()  # temp store to ensure uniqueness...
    for current_file in file_list:
        with open(os.path.join(in_dir, current_file), encoding="utf8") as in_file:
            for line in in_file:
                try:
                    link = shlex.split(line)[2]  # or whatever other function
                    if link not in links:
                        links.add(link)
                        out_file.write(link + "\n")
                except Exception:
                    continue

因此,当第一个索引(这里名为i)大于或等于列表长度时,它将“重置”它,因为操作模数(%)返回整数除法后留下的内容

编辑:解决方案确实符合要求,没有实例化任何类

希望它有所帮助:)

答案 1 :(得分:1)

试试这个。

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);
        }
    };
}

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);
}

结果:

a
b
c
a
b

答案 2 :(得分:1)

一种简单的方法是:

import com.google.common.collect.Iterables
import com.google.common.collect.Iterators;

Integer[] arr = {1,2,3,4,5};
Iterator<Integer> iter = Iterators.limit(Iterables.cycle(arr).iterator(),7) ;

答案 3 :(得分:1)

这是Java 8友好的方式:

IntStream.range(0, K)
    .map(i -> list[i % list.length])
    .forEach(cc -> /* play with CustomClass cc instance */);