java 迭代
迭代器的作用是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。
java中的很多容器都实现了Iterable接口,容器中的元素都是可以遍历的。
如下例,list容器中存储的是Integer对象,list可以返回一个Iterator对象用于遍历list中的元素。
// list中存储的是Integer对象
List<Integer> list = Arrays.asList(1,2,3,4,5);
// 容器List实现了Iterable接口,也即实现了iterator()方法
// 该方法可以生成一个迭代器遍历list中的元素
Iterator<Integer> iterator = list.iterator();
// 使用迭代器iterator遍历list中的每一个元素,并打印出来
while(iterator.hasNext())
System.out.print(iterator.next() + " ");
一种更为简洁的写法是:
// list中存储的是Integer对象
List<Integer> list = Arrays.asList(1,2,3,4,5);
// 遍历list中的每一个元素,并打印出来
for (int x:list)
System.out.print(x + " ");
迭代的实现
如果要写一个容器类,并使其具有迭代功能,该类应满足如下两个要求:
该类需继承Iterable接口,实现接口的iterator()方法;
定义一个实现Iterator接口的类,实现接口的hasNext()方法与next()方法。
如定义类Bag(背包)用于存储数据元素。
public class Bag<Item> {
private class Node {
Item item;
Node next;
}
private Node first;
private int N;
public boolean isEmpty() {return N==0;}
public int size() {return N;}
public void add(Item item) {
Node temp = new Node();
temp.item = item;
temp.next = first;
first = temp;
}
}
若要使容器Bag可迭代,Bag需要定义一个实现Iterator接口的类(BagIterator),该类中的hasNext()与next()方法可以帮助遍历元素。
private class BagIterator implements Iterator<Item> {
private Node current = first;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Item next() {
Item temp = current.item;
current = current.next;
return temp;
}
}
Bag需要实现Iterable接口,该接口的Iterator()方法,可以返回一个上述的迭代器(BagIterator)
public class Bag<Item> implements Iterable<Item>
@Override
public Iterator<Item> iterator() {
return new BagIterator();
}
完整代码如下:
import java.util.Iterator;
public class Bag<Item> implements Iterable<Item>{
private class Node {
Item item;
Node next;
}
private Node first;
private int N;
public boolean isEmpty() {return N==0;}
public int size() {return N;}
public void add(Item item) {
Node temp = new Node();
temp.item = item;
temp.next = first;
first = temp;
}
private class BagIterator implements Iterator<Item> {
private Node current = first;
@Override
public boolean hasNext() {
return current != null;
}
@Override
public Item next() {
Item temp = current.item;
current = current.next;
return temp;
}
}
@Override
public Iterator<Item> iterator() {
return new BagIterator();
}
}
测试如下:
public static void main(String[] args) {
Bag<Integer> bag = new Bag<>();
bag.add(3);
bag.add(2);
bag.add(3);
bag.add(1);
for (int i:bag)
System.out.println(i);
}
输出结果:
1
3
2
3
java 迭代的更多相关文章
- 【转】Java迭代:Iterator和Iterable接口
Java迭代 : Iterator和Iterable接口 从英文意思去理解 Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... ...
- java迭代map
java迭代map: import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.ut ...
- Java迭代 : Iterator和Iterable接口
从英文意思去理解 Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... Iterator: 在英语中or 结尾是都是表示 .. ...
- Java迭代实现斐波那契数列
剑指offer第九题Java实现 题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. public class Test9 { public static void ...
- Java 迭代接口:Iterator、ListIterator 和 Spliterator
1. 简介 当我们使用 for 或 while 循环来遍历一个集合的元素,Iterator 允许我们不用担心索引位置,甚至让我们不仅仅是遍历一个集合,同时还可以改变它.例如,你如果要删除循环中的元素, ...
- java 迭代的陷阱
/** * 关于迭代器,有一种常见的误用,就是在迭代的中间调用容器的删除方法. * 但运行时会抛出异常:java.util.ConcurrentModificationException * * 发生 ...
- CoreJava(一)—— Java迭代语句
本文介绍一些关于迭代语句的一些相关技巧以及Java8中的迭代语句的使用方法. public class TestBreak { public static void main(String[] arg ...
- SC || 关于java迭代中修改迭代集合的操作
在通过for循环遍历整个List/Map等的时候,如果想要进行remove的操作,这时就更改了迭代集合,会出现错误 一种方法是如果只会remove一个可以remove后直接break 另一种是把集合先 ...
- 170530、java 迭代hashmap常用的三种方法
@SuppressWarnings("rawtypes") public class HashMapDemo { //hashMap遍历 public static void ma ...
随机推荐
- mysql 数据库关于增加用户权限的问题
一新建用户 ----------- 二首先修改权限必须在电脑cmd 中运行 开设的权限 主要就是 1 所有库的 *.* 2 所有的表 db.* 3所有的字段db.t1 ...
- shell脚本实例-跟踪网站日常变动
#!/usr/bin/bash #用途:跟踪网页是否有更新 if [ $# -ne 1 ];then echo -e "$Usage $0 URl " exit fi first_ ...
- Day29作业及默写
作业: 1\ 默写 黏包协议 2\ 上传大文件(文件\视频\图片) 3\ 和你的同桌调通 从你的计算机上传一个视频到你同桌的电脑上 4\ 进阶 : 带上登录 Server #Server #!/usr ...
- 获取页面元素的css属性
function getStyle(obj, name){ if(obj.currentStyle) { return obj.currentStyle[name];//兼 ...
- USB抓包工具Bus Hound
/********************************************************************** * USB抓包工具Bus Hound * 说明: * 之 ...
- 使用matlab和ISE 创建并仿真ROM IP核
前言 本人想使用简单的中值滤波进行verilog相关算法的硬件实现,由于HDL设计软件不能直接处理图像,大部分过程都是可以将图像按照一定的顺序保存到TXT文档中,经过Modelsim仿真后,处理的数据 ...
- pytorch使用tensorboardX进行网络可视化
我们知道,对于pytorch上的搭建动态图的代码的可读性非常高,实际上对于一些比较简单的网络,比如alexnet,vgg阅读起来就能够脑补它们的网络结构,但是对于比较复杂的网络,如unet,直接从代码 ...
- [LeetCode&Python] Problem 349. Intersection of Two Arrays
Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...
- 关于js 异步回调的一些方法
http://www.ruanyifeng.com/blog/2012/12/asynchronous%EF%BC%BFjavascript.html
- mariaDB的安装 apache的安装
1.mariaDB的安装: 下载安装包: wget -c https://downloads.mariadb.com/MariaDB/mariadb-10.3.6/bintar-linux-glibc ...