【问题标题】:Can I create an iterator by copying the structure to a list and returning iterator of the list?我可以通过将结构复制到列表并返回列表的迭代器来创建迭代器吗?
【发布时间】:2017-04-27 07:34:50
【问题描述】:

如果我有一个有点复杂的结构(例如带有链接的哈希表)并且我想为该结构创建一个自定义迭代器,将复杂结构的内容复制到某种简单结构中是否有效(例如一个列表)然后返回简单结构上的隐式迭代器? 我意识到这需要额外的内存,但是还有什么其他原因我不应该这样做而不是从头开始创建自己的迭代器?

【问题讨论】:

  • 您不需要遍历原始集合中的元素来创建副本吗?此外,如果您想使用迭代器编辑元素,那么复制方法将不起作用(它会编辑副本)
  • @ROX 我可以使用 nested for each 循环遍历要复制的对象,但不能手动实现 hasNext() 函数或类似函数。编辑将不可用,这是真的。

标签: list iterator hashtable


【解决方案1】:

最终,如果您不需要通过迭代器编辑原始集合中的元素,您可以这样做。

您发现内存问题;还有其他你不应该这样做的原因吗?创建列表需要时间。您要么需要在每次想要迭代时重新创建此列表副本,要么必须确保在原始集合可以更改时保持列表是最新的。

如果你想使用你的迭代器来做一些事情,比如找到第一个符合某些规则的元素,那么这个成本尤其令人遗憾。如果第一个元素符合规则但有大量元素,那么您最终会进行大量复制,以便最终只迭代到第一个元素。

但是,您可以编写自己的迭代器来完成与嵌套循环相同的工作。在不知道您要迭代的结构的情况下很难给出一个体面的代码示例,但一般来说,您可能会使用一个在子集合中保存元素迭代器的类来实现它,这是先进的,直到当前子集合已经完全迭代,然后继续开始下一个子集合。所以你的迭代器也有一个集合的迭代器,即 2 个迭代器——一个返回一个元素,一个返回一个(子)集合。

【讨论】:

  • 我从来没有意识到我可以在一个迭代器中只包含一个迭代器。这使事情比我想象的要简单得多。我知道必须有一种更简单、更简洁的方法,而不仅仅是复制一个列表而不创建复杂的自定义迭代器类。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 2015-09-23
  • 2012-10-11
  • 2014-11-27
  • 2018-04-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多