简介:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。

目的:

总结:使用Iterator避免二次迭代

组成:

1,举例

package com.design.q.iterator.standard;import java.util.Iterator;@SuppressWarnings("unchecked")
public class ArrayList<E> implements Iterable<E>{private E[] array = (E[]) new Object[10];  //集合private static final int INCREMENT = 10;   //集合扩展大小private int size = 0;                      //集合实时大小/*** 集合元素添加* @param e*/public void add(E e){if(size < array.length){array[size ++] = e;}else{//集合大小不足时进行扩容E[] copy = (E[]) new Object[array.length + INCREMENT];System.arraycopy(array, 0, copy, 0, size);copy[size ++] = e;array = copy;}}/*** 集合数组化* @return*/public Object[] toArray(){Object[] copy = new Object[size];System.arraycopy(array, 0, copy, 0, size);return copy;}/*** 返回集合大小* @return*/public int size(){return size;}@Overridepublic Iterator<E> iterator() {return new Ite();}private class Ite implements Iterator<E>{int index = 0;@Overridepublic boolean hasNext() {return index != size();}@Overridepublic E next() {return array[index ++];}public void remove(){}}}

LinkedList

package com.design.q.iterator.standard;import java.util.Iterator;public class LinkedList<E> implements Iterable<E>{private Entry<E> header = new Entry<E>(null, null, null);private int size;public LinkedList() {header.next = header.previous = header;}/*** 集合新增元素* @param e*/public void add(E e){Entry<E> newEntry = new Entry<E>(e, header, header.next);newEntry.previous.next = newEntry;newEntry.next.previous = newEntry;size ++;}/*** 集合数组化* @return*/public Object[] toArray(){Object[] result = new Object[size];int i = size - 1;for(Entry<E> e = header.next; e != header; e = e.next){result[i --] = e.value;}return result;}/*** 返回集合大小* @return*/public int size(){return size;}private static class Entry<E>{E value;Entry<E> previous;Entry<E> next;public Entry(E value, Entry<E> previous, Entry<E> next){super();this.value = value;this.previous = previous;this.next = next;}}@Overridepublic Iterator<E> iterator() {return new Ite();}private class Ite implements Iterator<E>{Entry<E> index = header;@Overridepublic boolean hasNext() {return index.previous != header;}@Overridepublic E next() {E e = index.previous.value;index = index.previous;return e;}@Overridepublic void remove() {// TODO Auto-generated method stub
            }}
}

HashSet

package com.design.q.iterator.standard;import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;public class HashSet<E> implements Iterable<E>{private static final Object NULL = new Object();private Map<E, Object> map = new HashMap<>();/*** 集合元素新增* @param e*/public void add(E e){map.put(e, NULL);}/*** 集合数组化* @return*/public Object[] toArray(){return map.keySet().toArray();}/*** 集合大小* @return*/public int size(){return map.size();}@Overridepublic Iterator<E> iterator() {return map.keySet().iterator();}
}

2,Main

package com.design.q.iterator.standard;import java.util.Iterator;/*** 17-迭代器模式* * 使用Iterator避免二次迭代*/
public class MainTest {public static void main(String[] args) {/*** ArrayList迭代*/ArrayList<Integer> arrayList = new ArrayList<>();for(int i = 0; i < 10; i++){arrayList.add(i);}System.out.println("ArrayList 大小=" + arrayList.size());Iterator<Integer> arrayListIterator = arrayList.iterator();while(arrayListIterator.hasNext()){System.out.print(arrayListIterator.next() + " ");}
//        for(Integer i : arrayList){
//            System.out.print(i + " ");
//        }/*** LinkedList迭代*/LinkedList<Integer> linkedList = new LinkedList<>();for(int i = 0; i < 10; i ++){linkedList.add(i);}System.out.println("\nLinkedList 大小=" + linkedList.size());Iterator<Integer> linkedListIterator = linkedList.iterator();while(linkedListIterator.hasNext()){System.out.print(linkedListIterator.next() + " ");}
//        for(Integer i : linkedList){
//            System.out.print(i + " ");
//        }/*** HashSet迭代*/HashSet<Integer> hashSet = new HashSet<>();for(int i = 0; i < 10; i ++){hashSet.add(i);}System.out.println("\nHashSet 大小=" + hashSet.size());Iterator<Integer> hashSetIterator = hashSet.iterator();while(hashSetIterator.hasNext()){System.out.print(hashSetIterator.next() + " ");}
//        for(Integer i : hashSet){
//            System.out.print(i + " ");
//        }
    }
}

3,Result

ArrayList 大小=10
0 1 2 3 4 5 6 7 8 9
LinkedList 大小=10
0 1 2 3 4 5 6 7 8 9
HashSet 大小=10
0 1 2 3 4 5 6 7 8 9 

转载于:https://www.cnblogs.com/wanhua-wu/p/7246410.html

设计模式-17-迭代器相关推荐

  1. 【GOF23设计模式】迭代器模式

    [GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/  一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...

  2. 设计模式(17):结构型-组合模式(Composite)(2)

    设计模式(Design pattern) 是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式 ...

  3. [转载] Python进阶:设计模式之迭代器模式

    参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...

  4. 每日学一个设计模式1——迭代器模式

    引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...

  5. php迭代器实例,php设计模式之迭代器模式实例分析【星际争霸游戏案例】

    本文实例讲述了php设计模式之迭代器模式.分享给大家供大家参考,具体如下: 星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿. 我们自然会 ...

  6. 设计模式之迭代器模式(Iterator)摘录

    23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...

  7. 设计模式 - Iterator(迭代器)

    2019独角兽企业重金招聘Python工程师标准>>> 模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素. 设计一个 ...

  8. 设计模式复习-迭代器模式

    Iterator.H #pragma once #include <list> #include <windows.h> using namespace std;/* 设计模式 ...

  9. php foreach 循环 判断index 小于多少_PHP设计模式之迭代器模式 - 硬核项目经理

    一说到这个模式,就不得不提循环语句.在<大话设计模式>中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得.任何语言都有这种类似的语法可以方便 ...

  10. Java 设计模式之迭代器模式

    一.了解迭代器模式 1.1 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和 ...

最新文章

  1. 统计计量 | 协方差和相关系数的暧昧关系:共性与个性
  2. 整理Silverlight资源列表(四)——Silverlight案例补充
  3. 熵增学院-Anders-剑走偏锋,了解Spring Boot内部Servlet容器
  4. javascript 的面向对象特性参考
  5. 企业网络推广期间关于网站分享功能设计有哪些细节需要加以重视?
  6. 从零开始学视觉Transformer(6):Swin Transformer-1
  7. Android8内测申请,小米 6 安卓 8.0 来了 内测开始招募
  8. 《oracle每日一练》oralce数据库的导入导出
  9. 【C#】使用DWM实现无边框窗体阴影或全透窗体
  10. GIMP用Path作画了解一下
  11. 命令行工具恢复文件 foremost 和 extundelete 简介
  12. office2012产品密钥
  13. 一博商业进销存管理系统 v2008 怎么用
  14. 2022-2027年中国新能源汽车功率电子行业市场全景评估及发展战略规划报告
  15. elememt ui 组件 dialog使用备忘
  16. 发到微信的apk文件变成apk.1,如何安装,解决办法
  17. 【Jquery】文本框校验练习
  18. [M1]Daily Scum 10.8
  19. 喜讯:世界首款阿兹海默老年痴呆症治疗药将上市
  20. slf4j log4j logback关系详解和相关用法 【by Sinte-Beuve】

热门文章

  1. 2020年进入倒计时:一波前端资源送给你~这一年,谢谢自己!
  2. ”扶我起来,我还能学!“ 之ES2021 抢先尝
  3. 如何创建一个Mybatis程序,实现对数据库的简单查询?
  4. 360安全卫士电脑版_卸载360安全卫士!保护你的电脑安全
  5. mysql 二进制日志大小_mysql二进制日志。
  6. 假设计算机学院二年级,二年级计算机信息教案.doc
  7. C语言常用8种排序方法耗时测试
  8. python与机器学习(六)——支持向量机(SVM) 多层感知机(MLP)
  9. 在shell脚本中使用*正则的问题
  10. Scrapy框架的用法实例