如何为列表编写Iterator?

时间:2010-11-08 05:01:58

标签: java collections iterator

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

我的伪代码:

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(){

    }

}

4 个答案:

答案 0 :(得分:2)

  

我有一个实现List接口的类,并将数据存储在一个Object数组中。

您似乎正在重新实现ArrayList。这样做有充分的理由吗?

  

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

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

  

但是remove()方法存在问题,因为它应该允许删除调用我的迭代器的类的对象。怎么解决这个?

有两种方法:

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

  2. MyIterator.remove()抛出UnsupportedOperationExceptionremove方法是根据Iterator API规范的可选方法。

  3.   

    还有什么应该在我的主类的iterator()方法中发生?

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

答案 1 :(得分:1)

答案 2 :(得分:1)

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;
    }

}

答案 3 :(得分:0)

如何延长java.util.AbstractList?毕竟,java.util中的所有sun List实现(但不在java.util.concurrent中)都是如此。

这样你只需要实现

  • get(int)
  • add(E)(如果你想让列表变得可变)
  • 和一些构造函数

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