1. 程式人生 > >迭代器 Iterator及其子類ListItarator

迭代器 Iterator及其子類ListItarator

 ---------------迭代器 Iterator----------------
 任何容器類,都必須有某種方式可以插入元素並將它們再次返回。畢竟,持有事物是容器最基本的工作。

 對於List可以有add()方法來完成插入元素的操作,get()方法來完成獲取元素的操作。

 如果從更高的角度思考,會發現這裡有個缺點:要使用容器,就必須對容器的確切型別程式設計。

 現在思考兩個問題:
 1、如果原本是對List編碼的,但是後來如果要將相同的程式碼很方便的移植到Set,此時應該怎麼做?
 2、如果打算從頭開始編寫通用的程式碼,它們只是使用容器,但是不關心容器的具體型別,那麼要如何才能做到不重         寫程式碼就能夠應用於不同型別的容器呢?
迭代器的概念就能夠達到此目的。

Java的Iterator只能夠單向移動,從而這個Iterator只能夠用來做以下的事情:

1)使用iterator()方法要求容器返回一個Iterator。Iterator將準備好返回序列的第一個元素。
2)使用next()獲取序列的下一個元素。
3)使用hasNext()來檢測序列中是否還有元素。
4)使用remove()將迭代器新近返回的元素刪除。

------------------ListItarator---------------
ListIterator是一個更加強大的Iterator的子型別它只能用於List類的訪問
儘管Iterator只能夠向前移動,但是ListItarator可以雙向移動。

可用的方法:
1)使用hasNext()來檢測序列中是否還有元素。
2)使用next()獲取序列的下一個元素。
3)使用hasPrevious()來檢測序列中是否有上一個元素。
4)使用previous()獲取序列的上一個元素。
5)set()方法替換它訪問過的最後一個元素。
6)listIterator()方法產生一個指向List開始處的ListIterator。

7)listIterator(n)方法產生一個指向列表索引為n的元素處的ListIterator。

package com.lj95801.jihelei;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

import org.junit.Test;

/*
 * ---------------迭代器 Iterator----------------
 * 任何容器類,都必須有某種方式可以插入元素並將它們再次返回。畢竟,持有事物是容器最基本的工作。
 * 對於List可以有add()方法來完成插入元素的操作,get()方法來完成獲取元素的操作。
 * 如果從更高的角度思考,會發現這裡有個缺點:要使用容器,就必須對容器的確切型別程式設計。
 * 
 * 現在思考兩個問題:
 * 1、如果原本是對List編碼的,但是後來如果要將相同的程式碼很方便的移植到Set,此時應該怎麼做?
 * 2、如果打算從頭開始編寫通用的程式碼,它們只是使用容器,但是不關心容器的具體型別,那麼要如何才能做到不重寫程式碼就能夠應用於不同型別的容器呢?
 * 迭代器的概念就能夠達到此目的。
 * 
 * Java的Iterator只能夠單向移動,從而這個Iterator只能夠用來做以下的事情:
 * 1)使用iterator()方法要求容器返回一個Iterator。Iterator將準備好返回序列的第一個元素。
 * 2)使用next()獲取序列的下一個元素。
 * 3)使用hasNext()來檢測序列中是否還有元素。
 * 4)使用remove()將迭代器新近返回的元素刪除。
 * 
 * ------------------ListItarator---------------
 * ListIterator是一個更加強大的Iterator的子型別,它只能用於List類的訪問。
 * 儘管Iterator只能夠向前移動,但是ListItarator可以雙向移動。
 * 可用的方法:
 * 1)使用hasNext()來檢測序列中是否還有元素。
 * 2)使用next()獲取序列的下一個元素。
 * 3)使用hasPrevious()來檢測序列中是否有上一個元素。
 * 4)使用previous()獲取序列的上一個元素。
 * 5)set()方法替換它訪問過的最後一個元素。
 * 6)listIterator()方法產生一個指向List開始處的ListIterator。
 * 7)listIterator(n)方法產生一個指向列表索引為n的元素處的ListIterator。
 */

public class test_Iterator_ListIterator {
	
	@Test
	public void test_Iterator() {
		//下面用三種方法來新增list連結串列
		List<Person> list = 
				new ArrayList<Person>(Arrays.asList(new Person("小明",23), new Person("李雷",24)));
		
		Person[] pers = {new Person("韓梅",21),new Person("露西",20)};
		list.addAll(Arrays.asList(pers));
		
		Person p = new Person("小花",30);
		list.add(p);
		
		//用Iterator來操作list,可以利用hasNext()和next()方法配合來遍歷整個list連結串列
		Iterator<Person> it = list.iterator();//使用iterator()方法要求容器返回一個Iterator
		while(it.hasNext()){
			Person person = it.next();
			System.out.println(person);
		}
		
		System.out.println("------------->");
		//remove()方法
		it = list.iterator();	//讓it指標迴歸,此時it指向所有元素的前面
		it.next();		//此時it指向第一個元素
		it.remove();	//刪除it指向的那個元素,也就是第一個元素
		System.out.println(list);
	}
	
	
	@Test
	public void test_ListIterator(){
		List<Student> list = 
				new ArrayList<Student>(Arrays.asList(new Student("小明",23,97.5f), new Student("李雷",24,98)));
		list.add(new Student("小華",20,80.5f));
		list.add(new Student("小曼",24,80.5f));
		//指向索引值為1的Iterator,實際上指向的是索引值為0的元素。
		ListIterator<Student> lit = list.listIterator(1);
		while(lit.hasNext()){
			System.out.println(lit.next());
		}
		
		System.out.println("---------->");
		//訪問過的最後一個元素是列表中的最後一個元素。現在將其修改為Lily。
		lit.set(new Student("Lily",19,70));
		
		while(lit.hasPrevious()){
			System.out.println(lit.previous());
		}
	}
}

測試單元的執行結果:

@Test
public void test_Iterator()


測試單元的執行結果:

@Test
public void test_ListIterator()