Java 如何为列表编写迭代器?

Java 如何为列表编写迭代器?,java,collections,iterator,Java,Collections,Iterator,我有一个实现列表接口的类,它将数据存储在一个对象数组中。现在我需要为我的类编写迭代器方法。如何开始?我考虑编写一个实现迭代器接口的子类。类的对象将具有当前索引和最后一个索引的参数。每次调用next/hasNext时,这些参数都将被修改。这种方法正确吗?但remove()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题?在我的主类的迭代器()方法中应该发生什么 我的伪代码: class MyCollection<T> implements List<T&g

我有一个实现列表接口的类,它将数据存储在一个对象数组中。现在我需要为我的类编写迭代器方法。如何开始?我考虑编写一个实现迭代器接口的子类。类的对象将具有当前索引和最后一个索引的参数。每次调用next/hasNext时,这些参数都将被修改。这种方法正确吗?但remove()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题?在我的主类的迭代器()方法中应该发生什么

我的伪代码:

class MyCollection<T> implements List<T>{
    T[] tab;

    MyCollection(int len) {
        tab = (T[])new Object[len];
    }
    public Iterator iterator(){
    }
}

class MyIterator<T> implements Iterator {

    private int current;
    private int last;

    public void remove(){
    }

    public T next(){

    }

    public boolean hasNext(){

    }

}
类MyCollection实现列表{
T[]选项卡;
MyCollection(内部透镜){
tab=(T[])新对象[len];
}
公共迭代器迭代器(){
}
}
类MyIterator实现了迭代器{
私有电流;
私家车;
公共空间删除(){
}
公共交通工具{
}
公共布尔hasNext(){
}
}
看一看。

看一看。

类MyCollection实现列表{
T[]选项卡;
MyCollection(内部透镜){
tab=(T[])新对象[len];
}
公共迭代器迭代器(){
返回新的MyIterator(选项卡);
}
}
类MyIterator实现了迭代器{
专用int电流=0;
私家车;
私人T[]选项卡;
公共MyIterator(T[]选项卡){
this.tab=tab;
}
公共空间删除(){
抛出不支持的dexception();
}
公共交通工具{
电流++;
返回页签[当前];
}
公共布尔hasNext(){
当前==制表符长度-1;
}
}
类MyCollection实现列表{
T[]选项卡;
MyCollection(内部透镜){
tab=(T[])新对象[len];
}
公共迭代器迭代器(){
返回新的MyIterator(选项卡);
}
}
类MyIterator实现了迭代器{
专用int电流=0;
私家车;
私人T[]选项卡;
公共MyIterator(T[]选项卡){
this.tab=tab;
}
公共空间删除(){
抛出不支持的dexception();
}
公共交通工具{
电流++;
返回页签[当前];
}
公共布尔hasNext(){
当前==制表符长度-1;
}
}
我有一个实现列表接口的类,它将数据存储在一个对象数组中

看起来您正在重新实现
ArrayList
。这样做有充分的理由吗

类的对象将具有当前索引和最后一个索引的参数。每次调用next/hasNext时,这些参数都将被修改。这种方法正确吗

我认为你应该只需要一个索引。但基本思想是正确的

但remove()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题

有两种方法:

  • 从数组中移除元素,并以某种方式安排填充“孔”。a)将所有元素复制到大小为
    tab.length-1
    的新数组中,b)使用
    System.arraycopy
    或等效项将元素移动到删除的元素之后,或c)将null分配给插槽并更改类以跳过
    null
    元素。(最后一个可能是个非常糟糕的主意……)

  • Have
    MyIterator.remove()
    抛出一个
    UnsupportedOperationException
    。根据
    迭代器
    API规范,
    remove
    方法是可选的方法

  • 在我的主类的迭代器()方法中应该发生什么

    它应该创建并返回MyIterator类的实例

    我有一个实现列表接口的类,它将数据存储在一个对象数组中

    看起来您正在重新实现
    ArrayList
    。这样做有充分的理由吗

    类的对象将具有当前索引和最后一个索引的参数。每次调用next/hasNext时,这些参数都将被修改。这种方法正确吗

    我认为你应该只需要一个索引。但基本思想是正确的

    但remove()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题

    有两种方法:

  • 从数组中移除元素,并以某种方式安排填充“孔”。a)将所有元素复制到大小为
    tab.length-1
    的新数组中,b)使用
    System.arraycopy
    或等效项将元素移动到删除的元素之后,或c)将null分配给插槽并更改类以跳过
    null
    元素。(最后一个可能是个非常糟糕的主意……)

  • Have
    MyIterator.remove()
    抛出一个
    UnsupportedOperationException
    。根据
    迭代器
    API规范,
    remove
    方法是可选的方法

  • 在我的主类的迭代器()方法中应该发生什么

    它应该创建并返回MyIterator类的实例。

    扩展如何?毕竟,所有的sun列表实现(但不包括)都是这样做的

    这样,您只需要实现

    • (如果要使列表可变)
    • 还有一些建设者
    您可以免费获得所有其他方法(包括)。

    扩展如何?毕竟,所有的sun列表实现(但不包括)都是这样做的

    这样,您只需要实现

    • (如果要使列表可变)
    • 还有一些建设者

    您可以免费获得所有其他方法(包括)。

    对于希望了解如何在Java中有效实现利用迭代器的列表数据结构的人来说,这是最好的答案。感谢Tofu。这是最好的答案,对于任何想学习如何在Java中有效地实现列表数据结构的人来说,这是最好的答案
    class MyCollection<T> implements List<T>{
        T[] tab;
    
        MyCollection(int len) {
            tab = (T[])new Object[len];
        }
        public Iterator iterator(){
            return new MyIterator(tab);
        }
    }
    
    class MyIterator<T> implements Iterator {
    
        private int current = 0;
        private int last ;
        private T[] tab;
    
        public MyIterator(T[] tab){
           this.tab = tab;
        }
    
        public void remove(){
           throw UnsupportedException();
        }
    
        public T next(){
            current ++ ;
            return tab[current];
        }
    
        public boolean hasNext(){
            current == tab.length - 1;
        }
    
    }