迭代一个集合

时间:2014-03-08 15:56:34

标签: java collections iterator

我正在尝试创建hasnext()为迭代器设置next()方法,以便集合的输出为:

"printing","elements","in","order","from","collection"

输入:

[A] - ["printing", "elements", "in"]

[B] - ["order"]

[C] - ["from", "collection"]

目前我的方法看起来像:

    public MyIterator(Collection<Collection<Object>> myColl) {
    _myColl = myColl;
}


public boolean hasNext() {

    if(myColl.next != null)
    {
        return true
    }

    return !queue.isEmpty();
}


    public Object next() throws java.util.NoSuchElementException {

    //Dont really know what to put in here....


}

任何指针都将不胜感激

2 个答案:

答案 0 :(得分:0)

最好的方法是在访问下一个时声明一个计数器并递增。在逻辑上,如果我要表达,那将是这样的。

private int counter = 0;

public boolean hasNext(){
    counter = counter < collection.size()? counter + 1: counter;// increment
    return counter < collection.size();// check and give the appropriate boolean value
}

public T next(){
    return collection.get(counter);// to get the counter number of element
}

其中计数器是类中的私有变量, T 是构建集合的对象类型的泛型类型。像

Collection<String>

这个答案都是关于逻辑的。它可能包含也可能不包含确切的代码。

答案 1 :(得分:0)

好吧,我真的不明白你的问题..为什么你不能只使用普通的迭代器?

我将告诉你如何创建一个基本的迭代器,让你了解基本的工作方式,然后调整你的解决方案:

假设我们需要迭代List&lt; T&gt;并且你想创建一个辅助类来完成它。

class ListIterator<T>

您需要两个私人字段

  • 要迭代的列表
  • 指向最后一项
  • 的指针

和3个方法+ 1个构造函数

  • hasNext() - &gt; Boolean,如果有更多要迭代的项目,则返回true
  • next() - &gt;返回列表中的下一个元素
  • reset() - &gt;重置内部指针
  • 构造函数 - &gt;只需将列表作为参数进行迭代

如何查看字段?

private final List<T> list; // The list where this call will iterate
private int pointer; // The pointer to the next iterable item

如描述中所述,构造函数将引用列表,因此它只是

public ListIterator(List<T> list)
{
    this.list = list;
    pointer = 0;
}

保存引用并将指针设置为0(开始)。

我们来谈谈这些方法:

hasNext应该检查我们当前的指针是否已达到列表的大小。 所以它只是(pointer != list.size())

public boolean hasNext()
{
    return (pointer != list.size());
}

如果有更多项目可用,则为真,否则为假。

next返回下一个项目(如果有的话)。可以通过使用我们的hasNext方法进行简化,因此它将是

public T next()
{
    if (!hasNext())
        throw new NoSuchElementException("no field");

    return list.get(pointer++);
}

需要注意的事项:

  • T是返回,因为我们的列表是类型T
  • list.get(pointer ++)我们首先从位置pointer的列表中获取项目然后我们将1添加到指针

重置方法只是pointer = 0

public void reset()
{
    pointer = 0;
} 

如何使用?

与其他迭代器一样,创建一个ListIterator类型的新对象,并将列表传递给迭代。

List<String> test = new ArrayList<String>();
test.add("Hello");
test.add("World");
test.add("Whatsapp");

ListIterator<String> iterator = new ListIterator<String>(test);
while (iterator.hasNext())
{
    System.out.println(iterator.next());
}