网站首页 > java教程 正文
遍历可以说是对数据结构最常见的操作。之前说基本的操作是“增删改查”,但是遍历,就是要让我们找到,要对谁进行“增删改查”。一般,会结合一些 if 判断,来进行操作。
所以在准备这期文章时,我在删除那里停顿了很久。想不明白为什么边遍历边删除,要用 Iterator + remove,后来自己写了一个例子,放在文末。自觉非不用也没有关系,就是写出来很奇怪。欢迎批评指正。
套路:
- for/while 循环,最普通的那种挨个取,要求容器有序;
- for 增强版:增强 for 循环;
- Iterator for、while版,新建 Iterator 对象,然后具体再写成 for 或者 while 的循环,用 hasNext 来做是否进行下一次的判断,再新建临时对象,打印。
遍历 List
先初始化一个 ArrayList:
List<String> ids = new ArrayList<>();
ids.add("007");
ids.add("008");
ids.add("009");
复制代码
- 遍历第一种,因为 list 有序,可以用索引来遍历:
// List 遍历1
System.out.println("ids 遍历 for1");
for (int i=0; i<ids.size(); i++) {
System.out.println(ids.get(i));
}
复制代码
- 第二种,用增强 for 循环,写法不一样,和索引就没有关系了:
// List 遍历2
System.out.println("ids 遍历 for2");
for (String temp: ids) {
System.out.println(temp);
}
复制代码
- 第三种,定义迭代器,然后写在 for 或者 while 里面:
// List 遍历 for版 Iterator
System.out.println("ids 遍历 Iterator1");
for (Iterator iterator = ids.listIterator(); iterator.hasNext();) {
String temp = (String) iterator.next();
System.out.println(temp);
}
// List 遍历 while版 Iterator
System.out.println("ids 遍历 Iterator2");
Iterator<String> iterator = ids.iterator();
while (iterator.hasNext()) {
Object temp = iterator.next();
System.out.println(temp);
}
复制代码
以上内容的运行结果如下:
遍历 Set
Set 就无序了,所以,没有索引来用。这里顺带复习一下 HashSet 和 TreeSet 的区别,分别对应两种遍历方法:
- 第一种用增强 for 循环,用了 HashSet,更无序一点:
// 初始化一个 HashSet
Set<Integer> ages = new HashSet<>();
ages.add(8);
ages.add(88);
ages.add(36);
// Set 遍历 1
for (Integer i: ages) {
System.out.println(i);
}
复制代码
运行结果:
- 第二种,同样用 for,但是用 Iterator 来做:
Set<Integer> ages2 = new TreeSet<>();
ages2.add(8);
ages2.add(88);
ages2.add(36);
// Set 遍历 Iterator
for (Iterator iterator2 = ages2.iterator(); iterator2.hasNext();) {
Integer temp = (Integer) iterator2.next();
System.out.println(temp);
}
复制代码
运行结果就变成了:8 36 88(分行显示)。就已经按大小排好的顺序了。
遍历 Map
遍历 Map 的本质是在遍历 Set。
先初始化一个 课程表,用 HashMap 来存:
// 初始化一个 map
Map<String, String> courses = new HashMap<>();
courses.put("1001", "English");
courses.put("1003", "Novel Reading");
courses.put("1002", "History");
System.out.println("初始化的 Map:" + courses.toString());
复制代码
- 第一种方法,取 KeySet,然后用这个 Key,挨个再 get 对应的value:
// 遍历 Map 法1:根据 key ,取 value
Set<String> keySet = courses.keySet();
for (String courseId: keySet) {
System.out.println(courseId + ": " + courses.get(courseId));
}
复制代码
这里也可以不在外面定义 keySet,直接在 for 里面改成:
for (String courseID: courses.keySet()) {
}
复制代码
- 第二种,去取这个 EntrySet,然后直接用每一个 Entry 来 getKey 和 getValue:
// 遍历 Map 法2:就用 entrySet
System.out.println("用 EntrySet 来遍历:");
Set<Map.Entry<String,String>> kvs = courses.entrySet();
for (Iterator iterator2 = kvs.iterator(); iterator2.hasNext();) {
Map.Entry e = (Map.Entry) iterator2.next();
System.out.println(e.getKey() + ": " + e.getValue());
}
复制代码
对 Map 遍历的代码,运行结果如下:
迭代时候删除要用 Iterator?
遍历时就删除:
System.out.println("遍历完就删除, 这个就显得有点诡异");
int n = ids.size();
for (int i=0; i<n; i++) {
System.out.println(ids.get(0));
System.out.println(ids.toString());
ids.remove(0);
}
复制代码
就直接用上面初始化后的例子。只是一开始把 size 存起来。不然 size 会随着 list 删除一个元素而改变。 每次先打印一下要删的元素,再打一下当前的 list 状态。 运行结果:
推荐版写法:
也就是用 Iterator 来实现,在遍历有条件的删除:
// 推荐的写法:
System.out.println(ids.toString());
ids.add("wait remove 1");
ids.add("wait remove 2");
ids.add("wait remove 3");
System.out.println(ids.toString());
System.out.println("推荐写法:");
Iterator iterator1 = ids.iterator();
while(iterator1.hasNext()) {
String obj = (String) iterator1.next();
System.out.println(obj);
if (obj.contains("1")) {
iterator1.remove();
}
}
System.out.println("end"+ids.toString());
复制代码
运行结果:
写一下还是更能加深自己的学习理解。继续,开启下一个知识点!冲冲冲 ~
猜你喜欢
- 2024-11-20 学习编程第189天 python编程 遍历字典与列表
- 2024-11-20 女朋友跟我吐槽 Java 中 ArrayList 遍历时删除元素的各种姿势
- 2024-11-20 一篇文章带你弄懂Python基础之列表介绍和循环遍历
- 2024-11-20 Java8 Stream流递归,几行代码搞定遍历树形结构
- 2024-11-20 ArrayList还是LinkedList?性能可差千倍
- 2024-11-20 Java集合-List
- 2024-11-20 如何正确遍历删除List中的元素
- 2024-11-20 python每天学习一点点(遍历列表-for循环)
- 2024-11-20 Java集合框架进阶:玩转List、Set和Map接口的高级用法!
- 2024-11-20 java8对List集合根据某一字段进行分组
你 发表评论:
欢迎- 最近发表
-
- Java内存溢出紧急处理:10个必知的Linux命令快速定位OOM
- 面试常问的 25+ 个 Linux 命令(linux面试命令大全)
- Java堆外内存溢出紧急处理实战:Linux命令定位与Spring Boot解决
- java开发常用的Linux命令,高频的没你想象的多
- Java 应用 CPU 飙升?8 个 Linux 命令组合拳快速锁定异常线程
- Java 开发者线上问题排查常用的 15 个 Linux 命令
- Java程序员必备的Linux命令:让你的工作效率翻倍
- Java程序员必备的Linux命令全解析
- [超全整理] Java 程序员必备的 100 条 Linux 命令大全
- SAP ABAP资源导航(sap aatp)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)