Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在实现的迭代器类中使用方法_Java_Arraylist_Iterator - Fatal编程技术网

Java 在实现的迭代器类中使用方法

Java 在实现的迭代器类中使用方法,java,arraylist,iterator,Java,Arraylist,Iterator,我只是尝试在泛型ArrayList类中创建自己的迭代器。通常,迭代器接口包括next()、hasNext()和remove()方法。我想添加一些额外的方法。但是在测试这个迭代器时,我不能使用额外的方法。我甚至看不见他们 注意:MyListIterator类是ArrayList类中的一个内部类 private class MyListIterator implements Iterator<E>{ private int j=0;

我只是尝试在泛型ArrayList类中创建自己的迭代器。通常,迭代器接口包括next()、hasNext()和remove()方法。我想添加一些额外的方法。但是在测试这个迭代器时,我不能使用额外的方法。我甚至看不见他们

注意:MyListIterator类是ArrayList类中的一个内部类

  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()最后我可以看到我的方法。