Iterable(迭代器接口)

Iterable:可以说是站在集合框架最顶端的接口,实现集合的遍历。

最后才发现,这个接口里面要说的太少啦。好吧,我们重点就说说Iterator

Iterator:

方法就不在赘述,通过一个实际的例子来说明吧:

场景:我们需要在不新建对象的情况下,从源List删除指定的数据,最后打印出来:

其实从这个问题本身出发并不难,难就在于你从一开始就轻视它,最后结果就说明一切啦。也不卖什么关子啦,直接进入正题:

错误事例:

List sourceList = new ArrayList<>(Arrays.asList("a", "b", "a", "c", "d"));

for (int i = 0; i < sourceList.size(); i++) {

if (sourceList.get(i).equals("a")) {

sourceList.remove(sourceList.get(i));}

}

sourceList.forEach(System.out::println);


看结果简直perfect,但是确实暗中埋着深坑。当我发现第一个待移除元素的时候,从list移除掉,list.size发生变化,元素的索引也在变化。比如你循环到第2个元素的时候你把它删了,接下来你去访问第3个元素,实际上访问到的是原先的第4个元素。

解决方案1:

人为的维护下标,就能达到想要的效果。

List sourceList = new ArrayList<>(Arrays.asList("a", "a", "b", "a", "a", "a", "c", "d"));

for (int i = 0; i < sourceList.size(); i++) {

if (sourceList.get(i).equals("a")) {

sourceList.remove(sourceList.get(i));

i--; }

}

sourceList.forEach(System.out::print);

解决方案2:

这种方式就是借助迭代器实现List的动态删减。

⚠️:一定是Iterator的remove方法,还必须在next()方法后面使用,请看原文注释:

This method can be called only once per call to {@link #next}

关于具体实现,后续文章会具体说明

List sourceList = new ArrayList<>(Arrays.asList("a", "b", "a", "c", "d"));

Iterator iterator = sourceList.iterator();

while (iterator.hasNext()) {

String next = iterator.next();

if (next.equals("a")) {

iterator.remove(); }

}

sourceList.iterator().forEachRemaining(System.out::println);

哈哈,突然发现这个例子把Iterator的所有方法用上了,也算是碰巧吧。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,526评论 0 3
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,780评论 18 399
  • 传送门 解读阿里Java开发手册(v1.1.1) - 异常日志 前言 阿里Java开发手册谈不上圣经,但确实是大量...
    kelgon阅读 4,394评论 4 50
  • 听说樱花飘落的速度是每秒五厘米,那么,怎样的速度才能走完我和你之间的距离? 他喜欢蓝色,喜欢看海,也喜欢望着高...
    严夏一阅读 371评论 0 2