【问题标题】:Java - Iterable with own hasNext() and next(): how to do it right?Java - 使用自己的 hasNext() 和 next() 可迭代:如何正确执行?
【发布时间】:2013-03-29 15:20:00
【问题描述】:

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

【问题讨论】:

  • 你真的需要重写haveext()和next()方法吗?
  • @TheEwook 是的,因为循环属性
  • @TheEwook 抱歉有点晚了,但我只是想到了这一点并想知道:我怎么能不覆盖这些方法,因为我必须在 iterator() 中定义一个新的迭代器?我只是将它们放在内部类中

标签: java iterator iterable


【解决方案1】:

您的方法在错误的类上定义。 hasNextnextremove 方法需要在 Iterator 实现上定义,而不是在 Iterable 上。如果您在每个方法上放置了@Override 注释,编译器就会通知您这个错误。

按原样,您可以:

  • 为您的迭代器创建一个匿名内部类,并将这些方法移动到它的主体中
  • 为迭代器创建一个独立类,并再次将这些方法移入其中

请注意,当您这样做时,您将无法再利用嵌入列表的迭代器,但您将有效地定义自己的迭代器(当然,您可以将其包裹起来)。

【讨论】:

  • 啊,你的意思是创建一个自己的迭代器,比如 BLMovieIterator,然后在 iterator() 方法中返回一个新的对象?
  • @Big_Chair - 是的,这就是我的意思。
  • 迭代器类不需要像匿名内部类一样实现。您也可以选择将其实现为 BLMOvie 的成员类,即作为内部类或静态嵌套类。 Java 教程在这里有一个作为内部类实现的示例(尽管没有 Iterable 接口):docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html
【解决方案2】:

实际上,您不会处理迭代器方法,因为您实际上是在返回对象 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();
             }              
            };

【讨论】:

  • %(liste.size()-1) 有什么用处?如果存在索引越界访问,我们不应该扔掉吗?
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 2020-12-15
  • 1970-01-01
  • 1970-01-01
  • 2015-07-20
  • 2015-06-25
  • 1970-01-01
  • 2023-03-05
相关资源
最近更新 更多