为什么java.util.Iterator不会在嵌套循环中重置?

问题描述 投票:0回答:1

当我运行此代码时,迭代器iter在我第二次使用它时是空的。我每次在外循环中实例化iter,但它没有帮助!也就是说,在第一次迭代之后,iterable的长度为零!

为什么会这样?我错过了这种情况的一般做法是什么?

String path = "somefile.csv";
try {
        Reader in = new FileReader(path);
        Iterable<CSVRecord> records = CSVFormat.RFC4180.withHeader(MetadataExtractorForTables.HeaderType.class)
                .withDelimiter('\t').parse(in);

        // A stupid loop
        for(int i = 0; i < 3; i++) {                
            Iterator<CSVRecord> iter = records.iterator();
            System.out.println("---> " + Iterators.size(iter));
            System.out.println("--> " + StreamSupport.stream(records.spliterator(), false).count());

            /* ----------------------------------------
             * here I would like to use the iterator
             * in a (nested) loop
             * ---------------------------------------- */
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

输出如下所示:

---> 191
--> 0
---> 0
--> 0
---> 0
--> 0
java iterator iterable
1个回答
2
投票

因为这是一个邪恶的,合同破坏的Iterable。

来自docs

一旦从输入流中解析了记录,就不可能返回。

您必须将其明确地复制到List等中。

© www.soinside.com 2019 - 2024. All rights reserved.