我想编写一个类(称为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;
}
}
}
}
这是我的实施。
答案 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>
中。
答案 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>
接口的类的实例。