【问题标题】:Writing an iterator that wraps starts towards the end and wraps around to print all elements in order编写一个迭代器,它从结尾开始环绕并按顺序打印所有元素
【发布时间】:2017-09-28 18:44:24
【问题描述】:

我需要为一个环绕数组编写一个迭代器,其中列表的前面从末尾开始。所以Iterator需要从“front”变量开始,迭代到列表的末尾,然后从列表的开头开始迭代,直到碰到“rear”。

数组“rear”中的最后一个元素没有被打印,当数组已满时,它不会打印任何元素。

public Iterator<E> iterator(){      
    return new IteratorAssist();
}

class IteratorAssist implements Iterator<E> {

    public IteratorAssist() {
        index = front;
    }
    @Override
    public boolean hasNext() {

        if(index != data.length)
            return index != rear + 1 ;
        else if(index == data.length)
            index = 0;
        return index != rear + 1;
    }
    @Override
    public E next() {
        if(!hasNext())
            throw new NoSuchElementException();
        return data[index++];
    }
}

【问题讨论】:

  • 至于解决方案,我会简单地将data 与自身连接,然后迭代结果,从而避免使用指针的麻烦。
  • 你能把你设置的前后的代码显示出来吗?它们是否随时发生变化,您确定它们不是同一个元素并且前面总是> 后面吗?此外,带有两种打印输出情况的代码(其中后部元素被跳过,以及所有元素都被跳过)将非常有用。
  • 我在下面写了一个答案,可能对您的问题有用。如果您可以为您的问题添加更多细节,我很乐意添加并使其更具体。如果你觉得它对你有帮助,你会考虑接受它吗?只是单击答案旁边的灰色复选标记,使其变为绿色?

标签: java arrays iterator


【解决方案1】:

从您到目前为止发布的代码中很难判断,但是您的未打印完整数组的问题可能与迭代器的构造函数中的index=front 相关,并且front=rear+1 的可能性(当数组为全满)。因此,当您从前面开始时,您会立即在 hasNext() 上得到错误,并且您无法迭代。

如果是这种情况,您可以通过在回绕时始终在前后之间保留一个间隙单元来解决此问题。如果您发布您正在迭代的类的代码,我可以帮助您推荐一种方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 2017-12-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多