这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战。
遍历可以说是对数据结构最常见的操作。之前说基本的操作是“增删改查”,但是遍历,就是要让我们找到,要对谁进行“增删改查”。一般,会结合一些 if 判断,来进行操作。
所以在准备这期文章时,我在删除那里停顿了很久。想不明白为什么边遍历边删除,要用 Iterator + remove
,后来自己写了一个例子,放在文末。自觉非不用也没有关系,就是写出来很奇怪。欢迎批评指正。
套路:
for/while
循环,最普通的那种挨个取,要求容器有序;for
增强版:增强 for 循环;Iterator for、while版
,新建 Iterator 对象,然后具体再写成 for 或者 while 的循环,用 hasNext 来做是否进行下一次的判断,再新建临时对象,打印。
遍历 List
先初始化一个 ArrayList:
1 | Java复制代码List<String> ids = new ArrayList<>(); |
- 遍历第一种,因为 list 有序,可以用索引来遍历:
1 | Java复制代码// List 遍历1 |
- 第二种,用增强 for 循环,写法不一样,和索引就没有关系了:
1 | Java复制代码// List 遍历2 |
- 第三种,定义迭代器,然后写在 for 或者 while 里面:
1 | Java复制代码// List 遍历 for版 Iterator |
以上内容的运行结果如下:
遍历 Set
Set 就无序了,所以,没有索引来用。这里顺带复习一下 HashSet 和 TreeSet 的区别,分别对应两种遍历方法:
- 第一种用增强 for 循环,用了 HashSet,更无序一点:
1 | Java复制代码// 初始化一个 HashSet |
运行结果:
- 第二种,同样用 for,但是用 Iterator 来做:
1 | Java复制代码Set<Integer> ages2 = new TreeSet<>(); |
运行结果就变成了:8 36 88(分行显示)。就已经按大小排好的顺序了。
遍历 Map
遍历 Map 的本质是在遍历 Set。
先初始化一个 课程表,用 HashMap
来存:
1 | Java复制代码// 初始化一个 map |
- 第一种方法,取
KeySet
,然后用这个 Key,挨个再 get 对应的value:
1 | vbnet复制代码// 遍历 Map 法1:根据 key ,取 value |
这里也可以不在外面定义 keySet,直接在 for 里面改成:
1 | Java复制代码for (String courseID: courses.keySet()) { |
- 第二种,去取这个
EntrySet
,然后直接用每一个 Entry 来getKey
和getValue
:
1 | Java复制代码// 遍历 Map 法2:就用 entrySet |
对 Map 遍历的代码,运行结果如下:
迭代时候删除要用 Iterator?
遍历时就删除:
1 | Java复制代码System.out.println("遍历完就删除, 这个就显得有点诡异"); |
就直接用上面初始化后的例子。只是一开始把 size 存起来。不然 size 会随着 list 删除一个元素而改变。
每次先打印一下要删的元素,再打一下当前的 list 状态。
运行结果:
推荐版写法:
也就是用 Iterator 来实现,在遍历有条件的删除:
1 | Java复制代码// 推荐的写法: |
运行结果:
写一下还是更能加深自己的学习理解。继续,开启下一个知识点!冲冲冲 ~
本文转载自: 掘金