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

java中的很多容器都实现了Iterable接口,容器中的元素都是可以遍历的。

如下例,list容器中存储的是Integer对象,list可以返回一个Iterator对象用于遍历list中的元素。

  1. // list中存储的是Integer对象
  2. List<Integer> list = Arrays.asList(1,2,3,4,5);
  3. // 容器List实现了Iterable接口,也即实现了iterator()方法
  4. // 该方法可以生成一个迭代器遍历list中的元素
  5. Iterator<Integer> iterator = list.iterator();
  6. // 使用迭代器iterator遍历list中的每一个元素,并打印出来
  7. while(iterator.hasNext())
  8. System.out.print(iterator.next() + " ");

一种更为简洁的写法是:

  1. // list中存储的是Integer对象
  2. List<Integer> list = Arrays.asList(1,2,3,4,5);
  3. // 遍历list中的每一个元素,并打印出来
    for (int x:list)
  4. System.out.print(x + " ");

迭代的实现

如果要写一个容器类,并使其具有迭代功能,该类应满足如下两个要求:

该类需继承Iterable接口,实现接口的iterator()方法;

定义一个实现Iterator接口的类,实现接口的hasNext()方法与next()方法。

如定义类Bag(背包)用于存储数据元素。

  1. public class Bag<Item> {
  2.  
  3. private class Node {
  4. Item item;
  5. Node next;
  6. }
  7. private Node first;
  8. private int N;
  9.  
  10. public boolean isEmpty() {return N==0;}
  11. public int size() {return N;}
  12.  
  13. public void add(Item item) {
  14. Node temp = new Node();
  15. temp.item = item;
  16. temp.next = first;
  17. first = temp;
  18. }
  19.  
  20. }

若要使容器Bag可迭代,Bag需要定义一个实现Iterator接口的类(BagIterator),该类中的hasNext()与next()方法可以帮助遍历元素。

  1. private class BagIterator implements Iterator<Item> {
  2.  
  3. private Node current = first;
  4. @Override
  5. public boolean hasNext() {
  6. return current != null;
  7. }
  8. @Override
  9. public Item next() {
  10. Item temp = current.item;
  11. current = current.next;
  12. return temp;
  13. }
  14. }

Bag需要实现Iterable接口,该接口的Iterator()方法,可以返回一个上述的迭代器(BagIterator)

public class Bag<Item> implements Iterable<Item>

  1. @Override
  2. public Iterator<Item> iterator() {
  3. return new BagIterator();
  4. }

完整代码如下:

  1. import java.util.Iterator;
  2.  
  3. public class Bag<Item> implements Iterable<Item>{
  4.  
  5. private class Node {
  6. Item item;
  7. Node next;
  8. }
  9. private Node first;
  10. private int N;
  11.  
  12. public boolean isEmpty() {return N==0;}
  13. public int size() {return N;}
  14.  
  15. public void add(Item item) {
  16. Node temp = new Node();
  17. temp.item = item;
  18. temp.next = first;
  19. first = temp;
  20. }
  21.  
  22. private class BagIterator implements Iterator<Item> {
  23.  
  24. private Node current = first;
  25. @Override
  26. public boolean hasNext() {
  27. return current != null;
  28. }
  29. @Override
  30. public Item next() {
  31. Item temp = current.item;
  32. current = current.next;
  33. return temp;
  34. }
  35. }
  36.  
  37. @Override
  38. public Iterator<Item> iterator() {
  39. return new BagIterator();
  40. }
  41.  
  42. }

测试如下:

  1. public static void main(String[] args) {
  2.  
  3. Bag<Integer> bag = new Bag<>();
  4. bag.add(3);
  5. bag.add(2);
  6. bag.add(3);
  7. bag.add(1);
  8.  
  9. for (int i:bag)
  10. System.out.println(i);
  11. }

输出结果:

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. phpstom pojie

    https://blog.csdn.net/gu_wen_jie/article/details/79136475

  2. winform 子窗体调用父窗体中的方法

    在父窗体里定义委托 public delegate void inis(string str); 在父窗体中定义要调用的方法 public void inigs(string gs) { textBo ...

  3. [LeetCode&Python] Problem 748. Shortest Completing Word

    Find the minimum length word from a given dictionary words, which has all the letters from the strin ...

  4. Unity调用Windows弹框、提示框(确认与否,中文)

    Unity调用Windows弹提示框 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- ...

  5. s21day04 python笔记

    s21day04 python笔记 一.上周知识回顾及补充 回顾 补充 编译型语言和解释性语言 编译型:代码写完后,编译器将其变成成另外一个文件,然后交给计算机执行 常见的编译型语言:C,C++,Ja ...

  6. this语句的知识点第五点

    对不起大家久等了 最后一点 第五点 给元素中的某一个事件绑定方法,当事件触发时,执行绑定的方法,方法中的this指向当前元素. funciton fn(){ console.log(this) } d ...

  7. 2017.4.4 TCP/IP三次握手,四次挥手

    之前在电话面试的时候,被问到,所以找到一个超级容易理解的图片,自己保存,也算分享.

  8. JSM的topic和queue的区别

    在JMS(Java消息服务)中,Topic实现publish和subscribe语义.一条消息被publish时,它将发到所有感兴趣的订阅者,所以零到多个 subscriber(电脑词汇中解释为“用户 ...

  9. django 基于form表单上传文件和基于ajax上传文件

    一.基于form表单上传文件 1.html里是有一个input type="file" 和 ‘submit’的标签 2.vies.py def fileupload(request ...

  10. ubuntu安装mysql遇到的问题

    ERROR 1698 (28000): Access denied for user 'root'@'localhost' ubantu linux下安装新版mysql,登录时必须sudo mysql ...