Java 在实现的迭代器类中使用方法
我只是尝试在泛型ArrayList类中创建自己的迭代器。通常,迭代器接口包括next()、hasNext()和remove()方法。我想添加一些额外的方法。但是在测试这个迭代器时,我不能使用额外的方法。我甚至看不见他们 注意:MyListIterator类是ArrayList类中的一个内部类Java 在实现的迭代器类中使用方法,java,arraylist,iterator,Java,Arraylist,Iterator,我只是尝试在泛型ArrayList类中创建自己的迭代器。通常,迭代器接口包括next()、hasNext()和remove()方法。我想添加一些额外的方法。但是在测试这个迭代器时,我不能使用额外的方法。我甚至看不见他们 注意:MyListIterator类是ArrayList类中的一个内部类 private class MyListIterator implements Iterator<E>{ private int j=0;
private class MyListIterator implements Iterator<E>{
private int j=0;
private boolean removableNext = false;
private boolean removablePrev= false;
public boolean hasNext() { return j < size; } // size is field of outer instance
public E next() throws NoSuchElementException {
if (j == size) throw new NoSuchElementException("No next element");
removableNext = true; // this element can subsequently be removed
removablePrev=false;
return data[j++]; // post-increment j, so it is ready for future call to next
}
public boolean hasPrevious(){
return (j > -1) ;
}
public E previous(){
if(j==-1) throw new NoSuchElementException("No previous element");
removablePrev= true;
removableNext=false;
return data[j--];
}
public void remove(){
if (!removableNext && !removablePrev) throw new IllegalStateException("nothing to remove");
if(removableNext){
ArrayList.this.remove(j-1);
j--;
removableNext = false;
}
if(removablePrev){
ArrayList.this.remove(j+1);
j++;
removablePrev = false;
}
}
public void set(E e){
if (!removableNext && !removablePrev) throw new IllegalStateException("nothing to remove");
if(removableNext){
ArrayList.this.set(j-1,e);
j--;
removableNext = false;
}
if(removablePrev){
ArrayList.this.set(j+1,e);
j++;
removablePrev = false;
}
}
}
私有类MyListIterator实现迭代器{
私有int j=0;
私有布尔值removableNext=false;
私有布尔removablePrev=false;
public boolean hasNext(){return j-1);
}
公共服务{
如果(j=-1)抛出新的NosTouchElementException(“无先前元素”);
removablePrev=真;
removableNext=false;
返回数据[j--];
}
公共空间删除(){
如果(!removableNext&&!removablePrev)抛出新的IllegalStateException(“无需删除”);
if(removableNext){
ArrayList.this.remove(j-1);
j--;
removableNext=false;
}
如果(可移除的Prev){
ArrayList.this.remove(j+1);
j++;
removablePrev=false;
}
}
公共无效集(E){
如果(!removableNext&&!removablePrev)抛出新的IllegalStateException(“无需删除”);
if(removableNext){
ArrayList.this.set(j-1,e);
j--;
removableNext=false;
}
如果(可移除的Prev){
ArrayList.this.set(j+1,e);
j++;
removablePrev=false;
}
}
}
测试时,我只看到remove()、next()、hasNext()方法,这些方法是从迭代器实现的
测试类别为:
import java.util.Iterator;
public class DriverIterator {
public static void main(String[]args){
ArrayList<Integer> list = new ArrayList<>();
list.add(0, 1);
list.add(0, 2);
list.add(0, 3);
list.add(0, 4);
list.add(0, 5);
System.out.println(list.toString());
Iterator<Integer> iter = list.myListIterator();
}
}
import java.util.Iterator;
公共类驱动程序编写器{
公共静态void main(字符串[]args){
ArrayList=新建ArrayList();
列表。添加(0,1);
列表。添加(0,2);
列表。添加(0,3);
列表。添加(0,4);
列表。添加(0,5);
System.out.println(list.toString());
迭代器iter=list.myListIterator();
}
}
ArrayList类属于我,如果需要,我也可以共享它。您的
iter
变量的类型是Iterator
,因此是的,您只能使用其中声明的方法。如果您将iter
的类型更改为MyListIterator
,则可以使用额外的方法。(我还强烈建议不要用java.util
中已经使用过的名称创建自己的类……这会造成混乱。)但我不能使用MyListIterator,因为它是一个私有的内部类。在ArrayList类中。请同时共享ArrayList类。但正如@Jon Skeet所说,你需要与MyListIterator合作。为此,您需要将MyListIterator类设置为公共类,并使MyListIterator方法返回MyListIterator类型。因此,请将其设置为公共类。你希望如何能够有效地引用编译器无法“看到”的方法?是的,我知道了。我公开了它,并像这样定义了我的对象:ArrayList.MyListIterator iter=(ArrayList.MyListIterator)list.MyListIterator()代码>最后我可以看到我的方法。