我有一个实现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(){
}
}
答案 0 :(得分:2)
我有一个实现List接口的类,并将数据存储在一个Object数组中。
您似乎正在重新实现ArrayList
。这样做有充分的理由吗?
该类的对象将具有当前索引和最后索引的参数。每次调用next / hasNext时,都会修改这些参数。这种方法是否正确?
我认为你应该只需要一个索引。但基本思路是正确的。
但是remove()方法存在问题,因为它应该允许删除调用我的迭代器的类的对象。怎么解决这个?
有两种方法:
从数组中删除元素,并以某种方式安排填充“洞”。要么a)将所有元素复制到一个大小为tab.length - 1
的新数组,b)使用System.arraycopy
或等效项来移动被删除元素之后的元素,或者c)将null赋给槽并将类更改为跳过null
元素。 (最后一个可能是一个非常糟糕的主意......)
让MyIterator.remove()
抛出UnsupportedOperationException
。 remove
方法是根据Iterator
API规范的可选方法。
还有什么应该在我的主类的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
中)都是如此。
这样你只需要实现
您可以免费获得所有其他方法(包括iterator())。