java - 迭代复合材料
问题描述
在Head First Design Patterns一书中,作者描述了使用迭代器遍历复合数据结构。它们提供了一些示例代码,在执行时会打印出存储在组合中的一系列菜单项。但是,如果您尝试多次调用迭代器,它将不再按预期工作并且不会产生任何结果。以下代码似乎导致了问题:
public Iterator<MenuComponent> createIterator() {
if (iterator == null) {
iterator = new CompositeIterator(menuComponents.iterator());
}
return iterator;
}
本质上,他们正在创建一个单例迭代器,不能为将来的迭代重置。不幸的是,简单地替换这个逻辑来返回一个新的实例CompositeIterator
也会破坏算法。几年前在 GitHub 上提出了一个问题,但尚未解决。有人对如何克服这个问题有任何建议吗?
解决方案
正如评论中的链接问题所说:
return iterator; // the `iterator' never resets to null once it's set.
我们需要重置iterator
我们已经完成了它,但不是当迭代器仍然有元素时,因为CompositeIterator
取决于那个。
一种方法是添加另一个iterator
重置条件 - 当迭代器没有更多元素时:
public Iterator<MenuComponent> createIterator() {
if (iterator == null || !iterator.hasNext()) {
iterator = new CompositeIterator(menuComponents.iterator());
}
return iterator;
}
推荐阅读
- excel - Excel 2002 XML 电子表格 - 验证问题
- c# - ASP.Net Core Web Api access-control-max-age 未在响应标头中发送
- javascript - 在 Webpack 项目中包含 KRPano
- tensorflow - Keras 输出的批量大小与我的训练集不同
- javascript - 在包装器中反应密钥道具
- c - BLE数据发送与nrf52
- postgresql - 确定每行中 JSON 对象中哪些字段包含最多空值/空值的最佳方法是什么?
- colors - 在 Julia 中定义 Dash 应用程序的背景颜色
- python - wxpython:只要第二帧打开就暂停代码
- plotly-dash - DASH plotly bootstrap 在打印时隐藏 div