Java - 创建一个返回迭代器的方法

时间:2015-02-28 22:43:20

标签: java

我目前正在创建一个名为ArraySet的类来实现Set接口。我应该创建一个迭代器方法,以自然顺序返回值,其中时间复杂度为iterator():O(1); hasNext():O(1); next():O(1);所需空间:O(1)。该方法应该返回执行此操作的迭代器。我对这种方法的工作方式以及我想要的方式感到困惑。因为它是一种方法,我不能在其中创建hasNext()或next()方法,以及我试图返回的Iterator是什么?我试着只返回一个迭代器,但它是抽象的,无法实例化。我可以理解创建一个新的迭代器类,但是我很难理解它在方法形式中是如何工作的。基本上,这个方法目前看起来是什么样的,但就像我说过我不知道甚至放在里面的东西。另外,如果它有帮助,ArraySet类中有两个字段,int size(数组中元素的数量)和T []元素(存储元素的数组,严格按照自然顺序排列,尽管我是' m甚至不确定如何强制执行自然秩序)

public Iterator<T> iterator() {
  return null;
}

2 个答案:

答案 0 :(得分:2)

  

因为它是一种方法,我不能在其中创建hasNext()或next()方法,以及我试图返回的Iterator?

不,方法无法在Java中定义其他方法。您是否考虑定义Iterator的匿名子类?那可以工作。

您需要创建一个具体的Iterator实现。然后,类中的iterator()方法将实例化并返回此实现的新实例。

为清楚起见,这里的东西的骨架可能是什么样的。您可以自行实施hasNext()next()方法!

public class ArraySet<T> implements Iterable<T> {

  // snip...

  @Override
  public Iterator<T> iterator() {
    return new MyIterator();
  }

  private class MyIterator implements Iterator<T> {

    @Override
    public boolean hasNext() {
      // your logic here
    }

    @Override
    public T next() {
      // your logic here
    }
  }
}

答案 1 :(得分:0)

这种情况非常适合anonymous class

  

匿名类使您可以使代码更简洁。它们使您能够同时声明和实例化一个类。他们就像当地的班级,除了他们没有名字。如果您只需要使用本地类一次,请使用它们。

@Override
public Iterator<T> iterator() {
    return new Iterator<T>() {
        @Override
        public boolean hasNext() {
            // ...
        }

        @Override
        public T next() {
            //..
        }

        @Override
        public void remove() {
            //..
        }
    };
}

另一方面,通过自然顺序,它们意味着结构的元素必须实现Comparable,并且给定O(1)requeriments,保存数据的内部数组应该已经按照这个自然顺序订购了。更灵活的方法(在标准java集合中使用)并不要求元素具有可比性,而是支持在构造函数中传递可选的比较器。

作为补充说明:使您的迭代器成为fail fast iterator,即知道每个修改操作使用计数器的并发修改,这将为您提供一些要点。 我们的想法是在ArraySet实例中使用一个计数器来计算已经进行了多少次写入操作(添加,删除)。然后,当您创建迭代器时,您记录计数器的当前值(在迭代器实例内,或作为iterator()方法中的最终变量),并且每次调用迭代器实例的方法时,您都会验证数据结构的计数器的当前值与记录的计数器的当前值相同,这意味着在迭代器的生命周期中未执行修改。否则会抛出ConcurrentModificationException

看看一些标准实现的来源,以获得很好的例子。