首页 > 解决方案 > 使用单元测试创​​建自定义迭代器

问题描述

我正在学习编程并且是这个领域的新手,因为我有机械背景。昨天我收到了教授的问题陈述。他为我们提供了一个自定义迭代器,该迭代器旨在交替迭代给定元素。

替代迭代器代码如下。

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”方法编写单元测试。

我们可以实现除队列之外的任何其他数据结构吗?

我完全被吹走并且厌倦了理解如何解决这个挑战,但在这里很困惑。如果你们可以帮助我,那么我可以很快学习重要的概念。

提前感谢您,任何帮助表示赞赏。

标签: javajunitcollectionsiterator

解决方案


队列在这里很有帮助,但不是你使用它的方式。

将提供给构造函数的迭代器中的所有元素复制到队列中,然后从该队列中实现自定义迭代器并没有真正意义:如果要将元素放入已经实现的集合中Iterable,您也可以只需使用 thatIterable的迭代器。

但这也可能不是练习的重点:您可以懒惰地使用输入迭代器。(此外,如果其中一个迭代器是无限的怎么办......)

我建议的想法是创建一个迭代器队列,而不是元素。这是您如何做到这一点的描述;我不想给你代码来破坏你的学习体验:

  • 在您的构造函数中,将参数中的迭代器放入队列中。
  • 要实现hasNext(),将迭代器从队列头部弹出,其hasNext()为 false ;当队列头部的迭代器有下一个元素时停止(在这种情况下返回 true),或者队列为空(在这种情况下返回 false)。
  • 要实现next(),将 head 迭代器从队列中弹出,并获取它的下一个元素:这就是您将返回的内容。但是,在此之前,如果迭代器有更多元素,请将其推到队列的尾部(这样做意味着您将在下一次迭代中查看下一个迭代器)。

推荐阅读