如何实现一个动态增长的列表

5
我正在尝试遍历相同的数据,但只想在必要时加载数据。我还想在多个并发迭代器中重用获取的数据。
是否有一种对象或模式,可以创建一个底层数据,该数据有机会在运行时获取更多数据,但跨多个实例使用相同的获取数据?该列表应能够并发使用。 我目前正在使用Java。
我已经创建了一个迭代器,返回可用的值,如果它耗尽了其缓冲区中的数据,那么它会去查找更多的数据以供返回。不幸的是,这意味着如果有多个对象实例,它将对每个实例处理数据一次。
如果我使用LinkedList,则担心ConcurrentModificationError。
更新:下面的答案确实讨论了实现这一点的有效方法,但我曾经因此产生了很多问题(非标准,使实现者混淆,好处不值得困惑)。虽然我仍然认为这是一个有趣和有价值的途径,但可能会出现问题。与往常一样,在问“如何”做某事之前,您应该先问自己“是否”应该这样做。

数据结构中是否应该删除数据? - SimonC
1
你能否使用具有MapLoaderHazelcast映射? - vikingsteve
不会删除任何数据(直到我释放对象)。 - Jefferey Cave
1
你所需要的东西有点像Scala的Stream。 - marcus
回想起来,我当时试图实现一个“流”概念,但是可以多次迭代。 - Jefferey Cave
4个回答

3
这是我应该做的方式。
创建一个实现Iterable的类。 该类需要一个类型为ArrayList的私有变量,该变量初始化为空列表。 该类需要一个fill方法,该方法从数据源中提取一个或多个条目,并将它们添加到私有列表的末尾。 该类需要一个noMore标志,当fill方法无法获取更多数据时设置该标志。 该类需要一个iterator()方法来提供内部Iterator类的新实例: 每个迭代器都需要父类列表中的私有索引和位置。 hasNext方法测试索引是否与父类列表大小相同。如果它们相同,则调用fill。如果设置了noMore标志,则返回false。 next 方法...你知道的。
所有这些都需要正确同步...
通过隐藏私有列表并不在其上使用迭代器,此方法避免了ConcurrentModificationExceptions问题。实际迭代器将使用get (int)在私有列表上获取元素。
注意:如果公开私有列表,允许其他代码以正常方式更新或迭代列表,则此方法不能预测地工作。

魔鬼常藏于细节之中,但这听起来似乎可行。 - assylias
好的回答。我不得不读两遍你的回答才能完全理解你在说什么。我建议的改进你已经提到了。魔鬼确实藏在细节中。 - Jefferey Cave
“Iterator”和“Iterable”不是同一回事。这是一个思想实验,为我强化了这个概念。爬行列表的东西并不等同于列表本身,你的答案强调了这一点。 - Jefferey Cave

1

有趣,但不正确。我的意思是,这意味着底层列表的任何增长都无法访问迭代器的其他实例。 - Jefferey Cave

0

我认为这不会起作用,因为我希望返回的数据可以并行处理,同步将强制进行串行数据访问。 - Jefferey Cave

0

我喜欢对象池,但在这种情况下它绝对不适用。数据是网页列表,我希望每个线程都可以访问每个页面,并且没有理由不允许它们同时执行。 - Jefferey Cave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接