我有一个实现Iterable的类,但使用自己的hasNext()
和next()
方法:
public class BLMovie implements Iterable<BLMovieFrame> {
@Override
public Iterator<BLMovieFrame> iterator() {
iteratorVar = 0;
return liste.iterator();
}
public boolean hasNext() {
if (loop)
return true;
return iteratorVar < liste.size();
}
public BLMovieFrame next() {
iteratorVar = (iteratorVar++)%(liste.size()-1);
return liste.get(iteratorVar);
}
public void remove() {
throw new UnsupportedOperationException();
}
我很确定这不是最好的方法, 关于Iterable的其他主题似乎并不关心自己的下一个方法,那么有人对我有建议吗?
答案 0 :(得分:4)
您的方法是在错误的类上定义的。需要在hasNext
实施中定义next
,remove
和Iterator
方法,而不是Iterable
。如果您在每个方法上放置了@Override注释,编译器就会告诉您这个错误。
实际上,您可以:
请注意,当您执行此操作时,您将无法再利用嵌入式列表的迭代器,但您将有效地定义自己的迭代器(当然,您可以将其包裹起来)。
答案 1 :(得分:3)
实际上你不会处理你的迭代器方法,因为你实际上是在返回对象liste
的迭代器。
如果要实现自己的迭代器,最好的方法是创建一个匿名内部类。
@Override
public Iterator<BLMovieFrame> iterator() {
// TODO Auto-generated method stub
return new Iterator <BLMovieFrame> (){
@Override
public boolean hasNext() {
if (loop)
return true;
return iteratorVar < liste.size();
}
@Override
public BLMovieFrame next() {
iteratorVar = (iteratorVar++)%(liste.size()-1);
return liste.get(iteratorVar);
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};