李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
迭代器--ListIterator
Leefs
2019-12-03 AM
4672℃
3条
### `ListIterator` `ListInterator`是一个更加强大的Iterator的子类型,它只能用于各种List类的访问。尽管Iterator只能向前移动,但是`ListIterator`可以双向移动。它还可以产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引,并且可以使用set()方法替换它访问过的最后一个元素。你可以通过`listIterator()`方法产生一个指向List开始处的`ListIterator`,并且可以通过调用`listIterator(n)`方法创建一个一开始就指向列表索引为n元素处的`ListIterator`。 **优点总结** > 1. 1.双向移动(向前/向后遍历) > 2. 2.产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引。 > 3. 3.可以使用set()方法替换它访问过的最后一个元素。 > 4. 4.可以使用add()方法在next()方法返回的元素之前或previous()方法返回的元素之后插入一个元素。 ### 迭代器遍历说明 注意,迭代器 没有当前所在元素一说,它只有一个游标( cursor )的概念,这个游标总是在元素之间,比如这样: ![ListIterator01.jpg][1] 初始时它在第 0 个元素之前,调用 next() 游标后移一位: ![ListIterator02.jpg][2] 调用 previous() 游标就会回到之前位置。当向后遍历完元素,游标就会在元素 N 的后面: ![ListIterator03.jpg][3] 也就是说长度为 N 的集合会有 N+1 个游标的位置。 ### 代码示例 ```java public class ListIteration { public static void main(String[] args) { List
pets = Pets.arrayList(8); ListIterator
it = pets.listIterator(); while(it.hasNext()){ System.out.println(it.next()+","+it.nextIndex()+","+it.previousIndex()+";"); } System.out.println(); while(it.hasPrevious()){ System.out.print(it.previous().id()+" "); } System.out.println(); System.out.println(pets); it = pets.listIterator(3); while(it.hasNext()){ it.next(); it.set(Pets.randomPet()); } System.out.println(pets); } } ``` > 运行结果 ```java Rat,1,0; Manx,2,1; Cymric,3,2; Mutt,4,3; Pug,5,4; Cymric,6,5; Pug,7,6; Manx,8,7; 7 6 5 4 3 2 1 0 [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Manx] [Rat, Manx, Cymric, Cymric, Rat, EgyptianMau, Hamster, EgyptianMau] Process finished with exit code 0 ``` `Pets.randomPet()`方法用来替换在列表中从位置3开始向前的所有Pet对象。 **参数方法说明** > + 1.`void hasPrevious()`:判断游标前面是否有元素; > > + 2.`Object previous()`:返回游标前面的元素,同时游标前移一位。游标前没有元素就报 `java.util.NoSuchElementException` 的错,所以使用前最好判断一下; > + 3.`int nextIndex() `:返回游标后边元素的索引位置,初始为 0 ;遍历 N 个元素结束时为 N; > + 4.`int previousIndex()`:返回游标前面元素的位置,初始时为 -1,同时报 `java.util.NoSuchElementException` 错; > + 5.`void add(E)`:在游标 前面 插入一个元素 > + 6.`void set(E)`:更新迭代器最后一次操作的元素为 E,也就是更新最后一次调用 next() 或者 previous() 返回的元素。 > + 注意,当没有迭代,也就是没有调用 next() 或者 previous() 直接调用 set 时会报 `java.lang.IllegalStateException` 错; **`ListIterator`两种获取方式** > + `List.listIterator()` > + `List.listIterator(int location)` **区别在于第二种可以指定 游标的所在位置。** ### 练习题 ```java 创建并组装一个List
,然后创建第二个具有相同尺寸的List
,并使用ListIterator读取第一个List中的元素,然后再将它们以反序插入到第二个列表中。 ``` > **代码** ```java public class ListIterationTest12 { public static void main(String[] args) { List
listIn1 = new ArrayList<>(Arrays.asList(1,2,3,4,5,6,7,8,9,10)); ListIterator
listIterator1 = listIn1.listIterator(); List
listIn2 = new ArrayList<>(listIn1); ListIterator
listIterator2 = listIn2.listIterator(listIn2.size());//指向列表索引最后一个元素 while(listIterator1.hasNext()){ Integer tmp = listIterator1.next(); listIterator2.previous();//向前移动 listIterator2.set(tmp); } System.out.println("listIn"+listIn1); System.out.println("integers"+listIn2); } } ``` > 运行结果 ```java listIn[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] integers[10, 9, 8, 7, 6, 5, 4, 3, 2, 1] ``` [1]: https://lilinchao.com/usr/uploads/2019/12/947832453.jpg [2]: https://lilinchao.com/usr/uploads/2019/12/2963369915.jpg [3]: https://lilinchao.com/usr/uploads/2019/12/3067575008.jpg
标签:
Java
,
Java编程思想
,
JavaSE
,
持有对象
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://lilinchao.com/archives/249.html
上一篇
持有对象--迭代器
下一篇
JVM学习(十一)--自定义类加载器深入详解
评论已关闭
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
NLP
4
标签云
DataX
高并发
锁
nginx
Tomcat
并发编程
Golang基础
Kafka
SpringCloudAlibaba
MyBatis-Plus
散列
JavaWeb
BurpSuite
Java
Ubuntu
gorm
Azkaban
稀疏数组
数据结构和算法
JVM
递归
国产数据库改造
正则表达式
Hive
NIO
RSA加解密
DataWarehouse
Netty
Http
Linux
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞
评论已关闭