Java - 使用自己的hasNext()和next()进行迭代:如何正确执行?

时间:2013-04-07 15:11:24

标签: java iterator iterable

我有一个实现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的其他主题似乎并不关心自己的下一个方法,那么有人对我有建议吗?

2 个答案:

答案 0 :(得分:4)

您的方法是在错误的类上定义的。需要在hasNext实施中定义nextremoveIterator方法,而不是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();
             }              
            };