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

Java—创建一个返回迭代器的方法,java,Java,我目前正在创建一个名为ArraySet的类,该类实现Set接口。我应该创建一个迭代器方法,以自然顺序返回值,其中时间复杂度为iterator():O(1);hasNext():O(1);next():O(1);所需空间:O(1)。该方法应该返回执行此操作的迭代器。我对这种方法的工作方式和我到底想要什么感到困惑。因为这是一个方法,我不应该在其中创建hasNext()或next()方法,我要返回什么迭代器?我试图返回一个迭代器,但它是抽象的,无法实例化。我可以理解创建一个新的迭代器类,但是我很难理解

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

公共迭代器迭代器(){
返回null;
}
因为这是一个方法,我不应该在其中创建hasNext()或next()方法,我要返回什么迭代器

不,方法不能在Java中定义其他方法。您是否正在考虑定义
迭代器的匿名子类?那可能行得通

您需要创建一个具体的
迭代器
实现。然后,类中的
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
    }
  }
}
public类ArraySet实现了Iterable{
//剪断。。。
@凌驾
公共迭代器迭代器(){
返回新的MyIterator();
}
私有类MyIterator实现了迭代器{
@凌驾
公共布尔hasNext(){
//你的逻辑在这里
}
@凌驾
公共交通工具{
//你的逻辑在这里
}
}
}

此款手机非常适合手机

匿名类使您的代码更加简洁。它们使您能够同时声明和实例化一个类。它们与本地类类似,只是它们没有名称。如果只需要使用一次本地类,请使用它们

@覆盖
公共迭代器迭代器(){
返回新的迭代器(){
@凌驾
公共布尔hasNext(){
// ...
}
@凌驾
公共交通工具{
//..
}
@凌驾
公共空间删除(){
//..
}
};
}
另一方面,自然顺序意味着结构的元素必须实现,并且给定O(1)要求,保存数据的内部数组应该已经按照这种自然顺序进行了排序。更灵活的方法(在标准java集合中使用)是不要求元素具有可比性,而是支持在构造函数中传递可选的比较器

另一个注意事项是:使迭代器成为一个迭代器,也就是说,在每次修改操作中都使用计数器来了解并发修改,这将给您一些提示。 其思想是在your
ArraySet
实例中使用一个计数器来计算执行了多少写入操作(添加、删除)。然后,当您创建迭代器时,您记录计数器的当前值(在迭代器实例内,或作为
iterator()
方法中的最终变量),并且每次调用迭代器实例的方法时,您都验证数据结构计数器的当前值是否与记录的值相同,这意味着在迭代器的生命周期内没有执行任何修改。否则将抛出一个


查看一些标准实现的源代码以获得好的示例。

您可以从编写一个名为
ArraySetIterator
的类开始,该类实现了
迭代器的所有方法。然后在
迭代器
方法中实例化该类。谢谢!我想我明白你的意思了,谢谢。很抱歉,这花了这么长时间,这是我自3月份以来第一次登录,我刚刚看到了评论。为什么匿名类比内部类更可取?请详细说明“每次修改操作的计数器”部分,我想了解这一点。在代码可重用性方面更可取,减少代码冗长。当你不需要的时候,为什么给一个类命名呢?为什么要在使用它的地方声明它?在某些情况下,在访问最终方法变量方面也更可取,但在这种情况下,可能没有必要这样做
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
    }
  }
}
@Override
public Iterator<T> iterator() {
    return new Iterator<T>() {
        @Override
        public boolean hasNext() {
            // ...
        }

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

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