迭代器和 hasNext() 强大的实现
Posted
技术标签:
【中文标题】迭代器和 hasNext() 强大的实现【英文标题】:iterator and hasNext() power implementation 【发布时间】:2017-08-21 23:37:59 【问题描述】:我仍在学习 java,我正在尝试实现一个迭代器接口,它返回整数的幂值(10^1 = 10、10^2 = 100 等),但我遇到了语法问题
【问题讨论】:
您是否在循环中重新初始化您的迭代器? 我认为你需要显示来显示调用代码。我没有看到任何代码中的成员被重置。 hasNext() 不应该修改迭代器的任何状态。为什么要在 hasNext() 中增加 currentPow? 问题不在于您发布的代码。请提供Minimal, Complete, and Verifiable example (MCVE) 它知道递增是因为有人调用了 next()。有什么问题?见gist.github.com/jnizet/4299e66429d1874330fbc37e7514ee2b 【参考方案1】:首先,hasNext() 方法不能改变“currentPow”成员的值。 正确的实现是:
@Override
public boolean hasNext()
return currentPow <= maxPow;
你一直得到相同结果 (10) 的原因是你没有乘以类的成员。 您实际上并不需要“索引”成员,因此请定义:
public class powIterator implements Iterator<Integer>
private int currentPow = 1;
private int currentResult = 1;
现在 next() 应该是这样的:
@Override
public Integer next() throws NoSuchElementException
if (index <= maxPow)
index++;
currentResult *= base;
return currentResult;
else
throw new NoSuchElementException();
【讨论】:
【参考方案2】:迭代器中的变量不会每次都重置,您只是永远不要更新它们。所以在下一次运行中它们是一样的。
如前所述,您可能不应该在hasNext()
中更新currentPow
。顾名思义,它只是检查是否有更多项目。然后您应该在next()
中进行下一步。
不妨试试这样的:
private int currentPow = 1;
@Override
public boolean hasNext()
return currentPow <= maxPow;
@Override
public Integer next() throws NoSuchElementException
if(currentPow > maxPow)
throw new NoSuchElementException("Power is above the maximum");
int pow = (int) Math.pow(base, currentPow);
currentPow++;
return pow;
【讨论】:
以上是关于迭代器和 hasNext() 强大的实现的主要内容,如果未能解决你的问题,请参考以下文章