1. 程式人生 > >分析Iterator和ListIiterator這兩種迭代器~

分析Iterator和ListIiterator這兩種迭代器~

首先需要明確一點:迭代器指向的位置是元素之前的位置,如圖所示:

假設集合List是由List1、List2和List3組成,當使用語句:Iterator it=List.iterator()時,迭代器it指向的位置是上圖中Iterator1指向的位置,當使用語句:it.next()的時候,迭代器指向的位置後移到了上圖中Iterator2所指向的位置。

一、Iterator迭代器

包含的方法:

hasNext():如果迭代器後面的位置還有元素,返回true,否則返回false。

next():返回集合中Iterator指向位置後面的元素。

remove():刪除集合中Iterator指向位置後面的元素。

自定義一個ArrayLlist類,然後自定義迭代器,實現上述的三個方法!程式碼演示如下:

class MyList implements Iterable{
	private static int[] array;
	private static final int CAPACITY=10;
	private static int size;
	
	public MyList(){
		this(CAPACITY);
	}
	public MyList(int n){
		array=new int[n];
		size=0;
	}

	//擴容操作
	public void grow(){
		int newLength=CAPACITY+CAPACITY<<1;
		array=Arrays.copyOf(array, newLength);		
	}
	
	//新增元素:尾插法
	public void add(int t){
		if(size==CAPACITY){
			grow();
		}
		array[size++]=t;
	}
	
	//獲取元素
	public int get(int pos){
		if(pos<0 || pos>size){
			return -1;
		}
		return array[pos];
	}
	
	//刪除元素:按位置刪除
	public static void remove(int pos){
		if(size==0){
			return ;
		}
		if(pos<0 || pos>size){
			return ;
		}
		for(int i=pos;i<size;i++){
			array[i]=array[i+1];
		}
		size--;
	}
	public void show(){
		for(int i=0;i<size;i++){
			System.out.print(array[i]+"   ");
		}
		System.out.println();
    }
	@Override
	public Iterator iterator() {
		// TODO Auto-generated method stub
		return new DIYMyList();
	}
	
class DIYMyList implements Iterator{

	int before;//前一個元素的位置
	int after;//後一個元素的位置
	public DIYMyList(){
		before=after=0;
	}
	@Override
	public boolean hasNext() {
		// TODO Auto-generated method stub
		return before!=size;
	}

	@Override
	public Object next() {
		// TODO Auto-generated method stub
		int i=before;
		before=before+1;
		after=i;
		return array[after];
	}
	
	@Override
	public void remove() {//這裡直接呼叫MyList中的remove()方法。
		// TODO Auto-generated method stub
		MyList.remove(after);
	}
  }
}

二、ListIterator迭代器

包含的方法:

add(E e):將指定的元素插入列表,插入的位置為迭代器當前位置之前。

hasNext():正向遍歷列表,如果迭代器後面還有元素,返回true,否則返回false。

hasPrevious():逆向遍歷迭代器,如果迭代器前面還有元素,返回true,否則返回false。

next():返回ListIterator指向位置後面位置的元素。

nextIndex():返回ListIterator所需位置後面位置元素的索引。

previous():返回ListIterator指向位置前面位置的元素。

previousIndex():返回ListIterator所需位置前面位置元素的索引。

remove():刪除next()或者previous()返回的最後一個元素。

set(E e):將next()或者previous()返回的最後一個元素更改為指定的元素e。

三、兩者的區別

1、相同點

都屬於迭代器,當需要對集合中的元素進行遍歷且不需要干涉其遍歷過程時,這兩種迭代器都可以使用。

2、不同點

1)使用範圍不同

Iterator可以適用於任何集合;而ListIterator只能用於List及其子型別。

2)繼承關係

ListIterator    extends Iterator   

3)方法

ListIterator中有add()方法,可以向List中新增物件,但是Iterator不可以。

ListIterator可以定位當前索引的位置,可以實現物件的修改,但是Iterator不可以。

ListIterator可以實現逆向遍歷,但是Iterator不可以。

四、兩者的用法示例

程式碼演示:

LinkedList<String> list1=new LinkedList();
		list1.add("1");
		list1.add("2");
		list1.add("3");
		
		System.out.println("使用Iterator進行遍歷:");
	    Iterator<String> iterator1=list1.iterator();
	    while(iterator1.hasNext()){
	    	String str1=iterator1.next();
	    	System.out.print(str1+"   ");
	    }
	    System.out.println();
	    
	    System.out.println("使用ListIterator進行遍歷:");
	    ListIterator<String> iterator2=list1.listIterator();
	    while(iterator2.hasNext()){
	    	String str2=iterator2.next();
	    	System.out.print(str2+"  ");
	    }
	    System.out.println();
	}

結果示例: