迭代器 Iterator及其子類ListItarator
阿新 • • 發佈:2019-02-12
---------------迭代器 Iterator----------------
任何容器類,都必須有某種方式可以插入元素並將它們再次返回。畢竟,持有事物是容器最基本的工作。
現在思考兩個問題:
1、如果原本是對List編碼的,但是後來如果要將相同的程式碼很方便的移植到Set,此時應該怎麼做?
2、如果打算從頭開始編寫通用的程式碼,它們只是使用容器,但是不關心容器的具體型別,那麼要如何才能做到不重 寫程式碼就能夠應用於不同型別的容器呢?
迭代器的概念就能夠達到此目的。
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。
任何容器類,都必須有某種方式可以插入元素並將它們再次返回。畢竟,持有事物是容器最基本的工作。
對於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()