迭代器的作用是提供一种方法对一个容器对象中的各个元素进行访问,而又不暴露该对象容器的内部细节。

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

最新文章

  1. ARCGIS常用几种本地数据AE初始化
  2. 大不了高三艹个FZU
  3. Hadoop入门之安装配置(hadoop-0.20.2)
  4. 让Entity Framework启动不再效验__MigrationHistory表
  5. 快速入门系列--MVC--02路由
  6. EBS密码安全的几个参数
  7. 【转载】利用shell脚本获取一个文件的绝对路径readlink
  8. scala模式匹配
  9. floodlight StaticFlowPusher 基于网段写flow,通配
  10. PHP_SELF、 SCRIPT_NAME、 REQUEST_URI差别
  11. eclipse设置背景保护色及常用设置
  12. 文本与二进制关于\n的问题
  13. 网络编程基础API
  14. 雷林鹏分享:jQuery EasyUI 数据网格 - 创建子网格
  15. kettle实现sqlserver与mysql的连接并写入mysql
  16. (第十一周)约跑APP测试报告
  17. poj_2709 贪心算法
  18. green rgb(255, 102, 0) #FF6600
  19. 子集和问题(应用--换零钱)POJ2229:Sumsets
  20. socket编程(TCP)

热门文章

  1. 十、编写LED混杂设备驱动
  2. DRF-Rest_Framework 学习文档
  3. 2019-02-28-day001-python介绍
  4. java学习笔记23(Set接口)
  5. 【Python】利用正则解析xml练习题
  6. LVM逻辑卷
  7. Python学习笔记第六周
  8. Pytorch中的Batch Normalization操作
  9. Wifi设备接入流程
  10. 2018.4.2 sqlite优化