java - 使用单元测试创建自定义迭代器
问题描述
我正在学习编程并且是这个领域的新手,因为我有机械背景。昨天我收到了教授的问题陈述。他为我们提供了一个自定义迭代器,该迭代器旨在交替迭代给定元素。
替代迭代器代码如下。
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;
public class AlternatingIterator<E> implements Iterator{
private final Queue<E> queue = new LinkedList<>();
public AlternatingIterator(Iterator<E> ... iterators) {
for(Iterator<E> iterator : iterators) {
while(iterator.hasNext())
queue.add(iterator.next());
}
}
@Override
public boolean hasNext() {
return queue.isEmpty() ? false : true;
}
@Override
public Object next() {
return queue.poll();
}
}
现在,AlternatingIterator 应该在它在其构造函数中接收的迭代器之间按顺序交替。例如,如果使用三个迭代器 [a,b,c]、[1,2] 和 [x,y,z] 构造,则迭代器应按以下顺序生成元素 'a, 1, x, b, 2, y , c, z'</p>
我还必须为“hasNext”和“next”方法编写单元测试。
我们可以实现除队列之外的任何其他数据结构吗?
我完全被吹走并且厌倦了理解如何解决这个挑战,但在这里很困惑。如果你们可以帮助我,那么我可以很快学习重要的概念。
提前感谢您,任何帮助表示赞赏。
解决方案
队列在这里很有帮助,但不是你使用它的方式。
将提供给构造函数的迭代器中的所有元素复制到队列中,然后从该队列中实现自定义迭代器并没有真正意义:如果要将元素放入已经实现的集合中Iterable
,您也可以只需使用 thatIterable
的迭代器。
但这也可能不是练习的重点:您可以懒惰地使用输入迭代器。(此外,如果其中一个迭代器是无限的怎么办......)
我建议的想法是创建一个迭代器队列,而不是元素。这是您如何做到这一点的描述;我不想给你代码来破坏你的学习体验:
- 在您的构造函数中,将参数中的迭代器放入队列中。
- 要实现
hasNext()
,将迭代器从队列头部弹出,其hasNext()
为 false ;当队列头部的迭代器有下一个元素时停止(在这种情况下返回 true),或者队列为空(在这种情况下返回 false)。 - 要实现
next()
,将 head 迭代器从队列中弹出,并获取它的下一个元素:这就是您将返回的内容。但是,在此之前,如果迭代器有更多元素,请将其推到队列的尾部(这样做意味着您将在下一次迭代中查看下一个迭代器)。
推荐阅读
- web-applications - 用于 Web 应用程序 AR.js 的无标记的 Agumented 现实
- c# - 针对 localhost 相对 url 的请求“无法分配请求的地址”
- angular - Angular 6:仪表板 - ngFor 中的唯一 ID
- oracle-cloud-infrastructure - 我们能否使用 CLI 或 API 导出 Oracle OCI 的服务限制
- javascript - 我试图在页面加载时隐藏一个段落,然后执行显示/隐藏 jquery 并更改按钮名称 onclick
- javascript - 如何在 JavaScript 的帮助下遍历 JSON
- redis - 如何使用redis作为部分LRU?
- spring-boot - 如何在 Spring Security 中获取未经身份验证的 URL 的引用
- angular - 在动态添加表单字段时限制空字段
- sql - SQL Query 计算视图表中的库存