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

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 迭代的更多相关文章

  1. 【转】Java迭代:Iterator和Iterable接口

    Java迭代 : Iterator和Iterable接口 从英文意思去理解 Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... ...

  2. java迭代map

    java迭代map: import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.ut ...

  3. Java迭代 : Iterator和Iterable接口

    从英文意思去理解 Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的.able结尾的表示 能...样,可以做.... Iterator:   在英语中or 结尾是都是表示 .. ...

  4. Java迭代实现斐波那契数列

    剑指offer第九题Java实现 题目: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. public class Test9 { public static void ...

  5. Java 迭代接口:Iterator、ListIterator 和 Spliterator

    1. 简介 当我们使用 for 或 while 循环来遍历一个集合的元素,Iterator 允许我们不用担心索引位置,甚至让我们不仅仅是遍历一个集合,同时还可以改变它.例如,你如果要删除循环中的元素, ...

  6. java 迭代的陷阱

    /** * 关于迭代器,有一种常见的误用,就是在迭代的中间调用容器的删除方法. * 但运行时会抛出异常:java.util.ConcurrentModificationException * * 发生 ...

  7. CoreJava(一)—— Java迭代语句

    本文介绍一些关于迭代语句的一些相关技巧以及Java8中的迭代语句的使用方法. public class TestBreak { public static void main(String[] arg ...

  8. SC || 关于java迭代中修改迭代集合的操作

    在通过for循环遍历整个List/Map等的时候,如果想要进行remove的操作,这时就更改了迭代集合,会出现错误 一种方法是如果只会remove一个可以remove后直接break 另一种是把集合先 ...

  9. 170530、java 迭代hashmap常用的三种方法

    @SuppressWarnings("rawtypes") public class HashMapDemo { //hashMap遍历 public static void ma ...

随机推荐

  1. Java 内存监控命令简介(零)

    一.Java性能监控与调优命令.工具简介 1.jps :查看当前运行的Java程序端口号,包括运行jps的程序端口号. 2.jinfo :查看Java进程的运行时信息. 3.jmap + MAT :通 ...

  2. Strict Standards: Declaration of UserModel::toJSON() should be compatible with that of BaseModel::toJSON()

    使用php报了这个错误: 错误的意思是:  严格标准: usermodel中的 toJSON() 方法 应该 同 BaseModel中的toJson() 方法是兼容的. php要求 子类的方法如果同父 ...

  3. __new__() 与__init__()的区别

    __new__作用于__init__之前.前者可以决定是否调用后者,或者说可以决定调用那个类的__init__方法. 首先要知道在面向对象编程中,实例化基本遵循创建实例对象,初始化实例对象,最后返回实 ...

  4. python 正则匹配时间格式转换方法

    import re from datetime import datetime a = '2018年8月9日 10:10' s = re.findall('\d+',a) print(s) d = ' ...

  5. DRBD常用管理篇

          在DRBD进入使用阶段之后,要经常查看它的工作状态,通过这些状态来判断DRBD运行情况. 1) 使用drbd-overview命令观察状态      最为简便的方式就是运行drbd-ove ...

  6. WPA3在2018年为无线安全添砖加瓦

    Wi-Fi Alliance Announces WPA3, the Successor to Wi-Fi's WPA2 Security Protocol The Wi-Fi Alliance -- ...

  7. Maven下用MyBatis Generator生成文件

    使用Maven命令用MyBatis Generator生成MyBatis的文件步骤如下: 1.在mop文件内添加plugin <build> <finalName>KenShr ...

  8. 性能测试-3.Fiddler进行弱网测试

    fiddler模拟限速的原理(原文地址) 我们可以通过fiddler来模拟限速,因为fiddler本来就是个代理,它提供了客户端请求前和服务器响应前的回调接口,我们可以在这些接口里 面自定义一些逻辑. ...

  9. git clone新项目后如何拉取分支代码到本地

    1.git clone git@git.n.xxx.com:xxx/xxx.git 2.git fetch origin dev    命令来把远程dev分支拉到本地 3.checkout -b de ...

  10. Proxy --概述篇

    概述: Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy 可以理解成,在目标对象之前架设 ...