当前位置: 首页 > 面试题库 >

如何将一个迭代器复制到另一个?

严峰
2023-03-14
问题内容

我需要遍历for循环的每次迭代的值集,但仅对于第一次迭代,它可以正常工作。此后itr.hasNext()返回false

Iterator<String> itr = getQuestionIterator(File file);

for(Person p : persons)
{
    while(itr.hasNext())
    {
        String question = itr.next();
        ........
        ........
    }
}

我很清楚这种行为。

一种解决方案是getQuestionIterator(File file)在for循环中调用方法,因此对于每个for循环迭代,都会对其进行初始化。但这是非常无效的方法,因为它itr是独立的。

我尝试了此方法Iterator<String> temp = itr,但由于它仅包含参考,因此也无法正常工作。

有什么方法可以将迭代器复制到另一个或其他更好的方法中?


问题答案:

An
Iterator是可能的最小API,可以按顺序处理数据,因此它从基础数据源中抽象出来。由于它只能向前移动(next())而没有任何重置或后退选项,因此它是一种单向对象,使用后必须将其丢弃。而且由于它提供的API的限制,无法在不了解实现和/或底层数据源的情况下简单地“复制”它。

因此,有四种方法可以解决您的问题:

(1)从基础数据源重新获取一个新的迭代器

getQuestionIterator(File file)每当您需要遍历数据时再次调用即可。

  • 优点:易于使用,易于实施。无需缓存。
  • 缺点:性能(例如,必须再次读取/分析文件)。同时,基础数据源可能已更改。

(2)将所有处理代码合并到一个迭代循环中

代替…

while (iterator.hasNext()) { /* first processing step */ }
while (iterator.hasNext()) { /* second processing step */ }
while (iterator.hasNext()) { /* third processing step */ }
...

…合并所有步骤:

while (iterator.hasNext()) {
    String question = iterator.next();
    /* first processing step */
    /* second processing step */
    /* third processing step */
    ...
}
  • 优点:仅需要一个迭代器。无需缓存。
  • 缺点:并非总是可能,例如,如果处理步骤具有依赖性。

(3)将所有元素复制到本地缓存(Collection

遍历所有项目一次,并将它们放入本地集合中,您可以用来获取任意数量的迭代器:

// read everything into a local cache
Collection<String> cache = new ArrayList<>();
while (iterator.hasNext()) cache.add(iterator.next());

// now you can get as many iterators from cache as required:
Iterator<String> iter = cache.iterator();
// use iter

iter = cache.iterator(); // once more
// use iter
...
  • 优点:一旦所有数据都在缓存中,则实现简单,快速。
  • 缺点:需要额外的内存用于缓存。

(4)修改数据源API以使其实现处理问题

含义:更改getQuestionIterator(File file)为返回Iterable<String>而不是Iterator<String>。您可以从获得任意数量的迭代器Iterable

Iterable<String> iterable = getQuestionIterator(File file);
Iterator<String> iter = iterable.iterator();
// use iter

iter = iterable.iterator(); // once more
// use iter
  • 优点:基础数据源最了解如何缓存数据。万一基础数据源已使用缓存,则无需复制数据。
  • 缺点:并非总是可以更改API。


 类似资料:
  • 问题内容: 我有一些数据结构,我想将其中一个用作临时结构,将另一个用作非临时结构。 现在的问题当然是实际上只是指向,因此一旦清除,也是如此。 如何在使用Java时保留值? 问题答案: 您可以使用以下技巧: 或使用 您可以在此处获取有关clone()方法的一些信息 但是您应该记住,所有这些方式都会给您 List 的副本,而不是其所有元素。因此,如果您更改复制的列表中的元素之一,则它也将在原始列表中进

  • 我想将table 1的内容复制到table 2中,但它不是直接复制,因为table 2包含的列比表1多。结构类似于这样: 表 1 { 列 2 列 4 列 6 } 表2{column1 column2 column3 column4 column5 column6} 我想做的是将table1到table2中的每一行相加,并为缺少的列设置默认值。任何帮助都将不胜感激。

  • 您好,我正在尝试将一个表从一个docx文件复制到另一个docx文件,但实际情况是,该表的值在新文档中的表下方和表外部被复制(请参见下面的图片) Talbe在新的docx里 正如您所见,表的值被复制到表的外部。我使用的是Libre Office,ApachePOI版本3.17,我的电脑运行的是Ubuntu 16.04 我用来执行复制的代码如下

  • 问题内容: 我有两个具有相同属性名称的java类。如何将所有属性复制到另一个装有数据的bean中。我不想使用传统形式来复制属性,因为我有很多属性。 提前致谢。 1班 2班 问题答案: 用途:

  • 问题内容: 我有两个Java.io.File对象file1和file2。我想将内容从file1复制到file2。有没有一种标准的方法可以执行此操作,而无需创建必须读取文件1并写入文件2的方法 问题答案: 不,没有内置方法可以做到这一点。与您要完成的工作最接近的是from 的方法,如下所示: 并且不要忘记处理异常并在一个块中关闭所有内容。