设计模式-17-迭代器
简介:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
目的:
总结:使用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-迭代器相关推荐
- 【GOF23设计模式】迭代器模式
[GOF23设计模式]迭代器模式 来源:http://www.bjsxt.com/ 一.[GOF23设计模式]_迭代器模式.JDK内置迭代器.内部类迭代器 1 package com.test.it ...
- 设计模式(17):结构型-组合模式(Composite)(2)
设计模式(Design pattern) 是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式 ...
- [转载] Python进阶:设计模式之迭代器模式
参考链接: Python中的迭代器 在软件开发领域中,人们经常会用到这一个概念--"设计模式"(design pattern),它是一种针对软件设计的共性问题而提出的解决方案.在一 ...
- 每日学一个设计模式1——迭代器模式
引言 精通设计模式是从码农脱颖而出的条件之一.跟着<图解设计模式>这本书学习设计模式,从今天开始,一天总结一个设计模式. 迭代器模式(一个一个遍历) 用处 隐藏遍历集合的内部结构,遍历不同 ...
- php迭代器实例,php设计模式之迭代器模式实例分析【星际争霸游戏案例】
本文实例讲述了php设计模式之迭代器模式.分享给大家供大家参考,具体如下: 星际的任务关一般会有这样的设定:一开始电脑的农民不采矿,如果战斗打响,或者玩家造出第一个兵,电脑的农民开始采矿. 我们自然会 ...
- 设计模式之迭代器模式(Iterator)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 设计模式 - Iterator(迭代器)
2019独角兽企业重金招聘Python工程师标准>>> 模式用途:设计能装载任意对象的容器,并要求该容器有一个遍历元素的iterator()方法,用来遍历容器中的每个元素. 设计一个 ...
- 设计模式复习-迭代器模式
Iterator.H #pragma once #include <list> #include <windows.h> using namespace std;/* 设计模式 ...
- php foreach 循环 判断index 小于多少_PHP设计模式之迭代器模式 - 硬核项目经理
一说到这个模式,就不得不提循环语句.在<大话设计模式>中,作者说道这个模式现在的学习意义更大于实际意义,这是为什么呢?当然就是被foreach这货给整得.任何语言都有这种类似的语法可以方便 ...
- Java 设计模式之迭代器模式
一.了解迭代器模式 1.1 什么是迭代器模式 迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示. 迭代器模式把游走的任务放在迭代器上,而不是聚合上.这样简化了聚合的接口和 ...
最新文章
- 统计计量 | 协方差和相关系数的暧昧关系:共性与个性
- 整理Silverlight资源列表(四)——Silverlight案例补充
- 熵增学院-Anders-剑走偏锋,了解Spring Boot内部Servlet容器
- javascript 的面向对象特性参考
- 企业网络推广期间关于网站分享功能设计有哪些细节需要加以重视?
- 从零开始学视觉Transformer(6):Swin Transformer-1
- Android8内测申请,小米 6 安卓 8.0 来了 内测开始招募
- 《oracle每日一练》oralce数据库的导入导出
- 【C#】使用DWM实现无边框窗体阴影或全透窗体
- GIMP用Path作画了解一下
- 命令行工具恢复文件 foremost 和 extundelete 简介
- office2012产品密钥
- 一博商业进销存管理系统 v2008 怎么用
- 2022-2027年中国新能源汽车功率电子行业市场全景评估及发展战略规划报告
- elememt ui 组件 dialog使用备忘
- 发到微信的apk文件变成apk.1,如何安装,解决办法
- 【Jquery】文本框校验练习
- [M1]Daily Scum 10.8
- 喜讯:世界首款阿兹海默老年痴呆症治疗药将上市
- slf4j log4j logback关系详解和相关用法 【by Sinte-Beuve】
热门文章
- 2020年进入倒计时:一波前端资源送给你~这一年,谢谢自己!
- ”扶我起来,我还能学!“ 之ES2021 抢先尝
- 如何创建一个Mybatis程序,实现对数据库的简单查询?
- 360安全卫士电脑版_卸载360安全卫士!保护你的电脑安全
- mysql 二进制日志大小_mysql二进制日志。
- 假设计算机学院二年级,二年级计算机信息教案.doc
- C语言常用8种排序方法耗时测试
- python与机器学习(六)——支持向量机(SVM) 多层感知机(MLP)
- 在shell脚本中使用*正则的问题
- Scrapy框架的用法实例