使用迭代器创建一个Series



我想写一个类(称为Seii),它基本上是一个从0开始的整数序列。S0在构造函数中设置:

se + 1 = 3*(se/2)

问题在于:for循环应该能够遍历该类的对象,并输出序列的元素(不包含起始数字50)。此外,序列以第一个大于42的元素结束。

例如:

  for(int i:new Seii(2)){
      System.out.println(i)

发出:

3,4,6,9,10,15,16,24,36,54

我想用迭代器来做。有人能帮帮我吗?我的想法是重写next()方法,以便它为序列的下一个元素进行计算,但我没有得到这个逻辑的任何地方。

 public class Seii<T> implements Iterator {
   private ArrayList<Integer> list = new ArrayList<>();
   Iterator<Integer> it = list.iterator();
   private final int size;
   public Seii(int size) {
     this.size = size;
   }
   int seii = 0;
   @Override
   public boolean hasNext() {
     // TODO Auto-generated method stub
     return false;
   }
   @Override
   public Object next() {
     if ((size % 2) == 0) {
       seii = 3 * (seii/2);
       return seii;
     }
   }
   }
  }

Seii应该实现Iterable<Integer>,这将允许它支持增强的for循环语法。这样做的最简单的方法,IMHO,只是有一个内部Iterator类实现您的逻辑:

public class Seii implements Iterable<Integer> {
    private class SeiiIterator implements Iterator<Integer> {
        @Override
        public boolean hasNext() {
            return value <= 42;
        }
        @Override
        public Integer next() {
            if (!hasNext()) {
                throw new NoSuchElementException();
            }
            value = 3 * (value / 2);
            return value;
        }
    }

    private int value;
    public Seii(int value) {
        this.value = value;
    }
    @Override
    public Iterator<Integer> iterator() {
        return new SeiiIterator();
    }
}

您不需要存储序列,因此可以从实现中删除数组列表。您所需要的只是最后一个值,它可以在构造函数中设置:

// This is a wrapper class that constructs iterators.
// It is used for plugging in your code into enhanced "for" loop
class Seii implements Iterable<Integer> {
    private int current;
    private int max;
    public Seii(int current, int max) {
        this.current = current;
        this.max = max;
    }
    @Override
    public Iterator<Integer> iterator() {
        return new SeiIterator(current, max);
    }
}
// This is the actual iterator that maintains state
// and produces the desired sequence.
class SeiIterator implements Iterator<Integer> {
    private int current;
    private int max;
    public SeiIterator(int current, int max) {
        this.current = current;
        this.max = max;
    }
    @Override
    public boolean hasNext() {
        return current < max;
    }
    @Override
    public Integer next() {
        current = (3*current)/2;
        return current;
    }
    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }
}

请注意,为了在增强的for循环中使用迭代器,您需要将其包装在Iterable<Integer>中。

演示。

您的Seii类应该实现Iterable<Integer>而不是Iterator,因为这是增强的for循环所需的接口。它将有一个iterator方法,该方法返回实现Iterator<Integer>接口的类的实例。

最新更新