迭代器和 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() 强大的实现的主要内容,如果未能解决你的问题,请参考以下文章

迭代器和生成器

迭代器和生成器

迭代器和生成器

python2.7 可迭代对象迭代器和迭代的概念说明

python2.7 可迭代对象迭代器和迭代的概念说明

Python之迭代器和生成器