使用迭代器创建一个系列

时间:2015-07-11 13:07:46

标签: java iterator

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

se + 1 = 3*(se/2)

catch是:for循环应该能够迭代这个类的对象并吐出序列的元素(没有起始编号s0)。此外,序列以第一个元素大于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;
     }
   }

   }
  }

这是我的实施。

3 个答案:

答案 0 :(得分:3)

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

// 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>中。

Demo.

答案 1 :(得分:3)

Seii应该实现Iterable<Integer>,这将允许它支持增强的for循环语法。最简单的方法,恕我直言,只是有一个内部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();
    }
}

答案 2 :(得分:0)

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