Java 如何为列表编写迭代器?
我有一个实现列表接口的类,它将数据存储在一个对象数组中。现在我需要为我的类编写迭代器方法。如何开始?我考虑编写一个实现迭代器接口的子类。类的对象将具有当前索引和最后一个索引的参数。每次调用next/hasNext时,这些参数都将被修改。这种方法正确吗?但remove()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题?在我的主类的迭代器()方法中应该发生什么 我的伪代码:Java 如何为列表编写迭代器?,java,collections,iterator,Java,Collections,Iterator,我有一个实现列表接口的类,它将数据存储在一个对象数组中。现在我需要为我的类编写迭代器方法。如何开始?我考虑编写一个实现迭代器接口的子类。类的对象将具有当前索引和最后一个索引的参数。每次调用next/hasNext时,这些参数都将被修改。这种方法正确吗?但remove()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题?在我的主类的迭代器()方法中应该发生什么 我的伪代码: class MyCollection<T> implements List<T&g
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()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题
有两种方法:
tab.length-1
的新数组中,b)使用System.arraycopy
或等效项将元素移动到删除的元素之后,或c)将null分配给插槽并更改类以跳过null
元素。(最后一个可能是个非常糟糕的主意……)MyIterator.remove()
抛出一个UnsupportedOperationException
。根据迭代器
API规范,remove
方法是可选的方法ArrayList
。这样做有充分的理由吗
类的对象将具有当前索引和最后一个索引的参数。每次调用next/hasNext时,这些参数都将被修改。这种方法正确吗
我认为你应该只需要一个索引。但基本思想是正确的
但remove()方法有一个问题,因为它应该允许删除调用迭代器的类的对象。如何解决这个问题
有两种方法:
tab.length-1
的新数组中,b)使用System.arraycopy
或等效项将元素移动到删除的元素之后,或c)将null分配给插槽并更改类以跳过null
元素。(最后一个可能是个非常糟糕的主意……)MyIterator.remove()
抛出一个UnsupportedOperationException
。根据迭代器
API规范,remove
方法是可选的方法- 及
- (如果要使列表可变)
- 还有一些建设者
- 及
- (如果要使列表可变)
- 还有一些建设者
您可以免费获得所有其他方法(包括)。对于希望了解如何在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;
}
}