Java Iterator模式 Java Iterator模式, 模仿Collectin ArrayList LinckedList

一、有如下几个类

1.接口Collection.java

2.接口Iterator.java

3.ArrayList.java

4.LinkedList.java

5.Node.java

关系如下:

代码如下:

1.接口Collection.java

  1. public interface Collection<E> {
  2. public void add(E e);
  3. public int size();
  4. public Iterator iterator();
  5. }

  

2.ArrayList.java

  1. public class ArrayList<E> implements Collection<E>{
  2.  
  3. //先给定一个长度为10的数组
  4. Object [] objects = new Object[10];
  5.  
  6. //冗余一个int指数,方便判定是组是否为满和返回集合大小
  7. int index = 0;
  8.  
  9. @Override
  10. //1.动态添加元素
  11. public void add(E e) {
  12.  
  13. //1.1先判断数组是否已满
  14. if(index == objects.length){
  15. Object [] newObjects = new Object[objects.length*2];
  16. System.arraycopy(objects, 0, newObjects, 0, objects.length);
  17. objects = newObjects; //数组是引用数据类型
  18. }
  19.  
  20. //1.2为新添加的元素指定下标
  21. objects[index] = e;
  22.  
  23. //1.3index自加1,以方便返回集合在大小
  24. index++;
  25. }
  26.  
  27. //2.根据下标访问元素
  28.  
  29. @Override
  30. //3.返回集合大小
  31. public int size() {
  32. return index;
  33. }
  34.  
  35. @Override
  36. public Iterator iterator() {
  37. return new ArrayListIterator();
  38. }
  39.  
  40. private class ArrayListIterator implements Iterator {
  41.  
  42. private int currentIndex = 0;
  43.  
  44. @Override
  45. public Object next() {
  46. // 返回最下一个元素
  47. Object o = objects[currentIndex];
  48. currentIndex++;
  49. return o;
  50. }
  51.  
  52. @Override
  53. public boolean hasNext() {
  54. // 判断是否为最后一个元素
  55.  
  56. if(currentIndex >= index){
  57. return false;
  58. }
  59. return true;
  60. }
  61.  
  62. }
  63.  
  64. }

  

3.LinkedList.java

  1. public class LinkedList<E> implements Collection<E> {
  2.  
  3. private Node head;
  4. private Node tail;
  5. private int size;
  6.  
  7. public void add(E e){
  8. Node n = new Node(e, null);
  9. if(head == null){
  10. head = n;
  11. tail = n;
  12. size++;
  13. } else {
  14. tail.setNext(n);
  15. tail = n;
  16. size++;
  17. }
  18. }
  19.  
  20. public int size(){
  21. return size;
  22. }
  23.  
  24. @Override
  25. public Iterator iterator() {
  26. return new LinkedListIterator();
  27. }
  28.  
  29. private class LinkedListIterator implements Iterator {
  30.  
  31. private Node currentNode = head;
  32.  
  33. @Override
  34. public Object next() {
  35. Object o = currentNode.getData();
  36. currentNode = currentNode.getNext();
  37. return o;
  38. }
  39.  
  40. @Override
  41. public boolean hasNext() {
  42. if(currentNode.getNext() == null){
  43. return false;
  44. }
  45. return true;
  46. }
  47.  
  48. }
  49. }

4.Node.java

  1. public class Node {
  2.  
  3. private Object data;
  4. private Node next;
  5.  
  6. public Node(Object data, Node next) {
  7. super();
  8. this.data = data;
  9. this.next = next;
  10. }
  11.  
  12. public Object getData() {
  13. return data;
  14. }
  15.  
  16. public void setData(Object data) {
  17. this.data = data;
  18. }
  19.  
  20. public Node getNext() {
  21. return next;
  22. }
  23.  
  24. public void setNext(Node next) {
  25. this.next = next;
  26. }
  27.  
  28. }

5.Iterator.java

  1. public interface Iterator {
  2. public Object next();
  3. public boolean hasNext();
  4. }

6.Dog.java

  1. public class Dog {
  2. private int id;
  3.  
  4. public Dog(int id) {
  5. super();
  6. this.id = id;
  7. }
  8.  
  9. @Override
  10. public String toString() {
  11. return "Dog"+id;
  12. }
  13. }

7.测试类CollectionTest.java

  1. public class CollectionTest {
  2.  
  3. @Test
  4. public void test() {
  5. Collection co = new LinkedList();
  6. for(int i = 0 ;i < 15 ;i++){
  7. co.add(new Dog(i));
  8. }
  9. System.out.println(co.size());
  10.  
  11. Iterator it = co.iterator();
  12. while(it.hasNext()){
  13. System.out.println(it.next());
  14. }
  15. }
  16.  
  17. }

运行结果

Java-马士兵设计模式学习笔记-迭代器模式-模仿Collectin ArrayList LinckedList的更多相关文章

  1. Java-马士兵设计模式学习笔记-命令模式

    一.概述 命令模式 二.代码 1.Client.java public class Client { public void request(Server server){ server.addCom ...

  2. Java-马士兵设计模式学习笔记-桥接模式

    一.概述 1.桥接模式的应用情况:(1)两个维度扩展(2)排列组合 二.代码 1.Gift.java public class Gift { protected GiftImpl giftImpl; ...

  3. Java-马士兵设计模式学习笔记-工厂模式-抽象工厂模式

    一.概述 1.抽象工厂:当情况是需要产生一系列产品,若需更换产品,则要求一系列产品一起换,且要控制一系列产品的产生过程,此时可考虑抽象工厂模式.例:小明装修屋子,把电视.冰箱都替换掉,他这次需要把电视 ...

  4. Java-马士兵设计模式学习笔记-工厂模式-简单工厂

    一.概述 1.目标:要控制任意类型交通工具的生产模式 2.目标有两层意思(1)任意类型 (2)生产模式,所以对应的,要这两个层面上抽象(Movable,VehicleFactory),利用接口,实现多 ...

  5. Java-马士兵设计模式学习笔记-策略模式-模拟 Comparator接口

    续上一篇  <Java 模拟 Comparable接口> 一.Teacher类及Student类的比较大小方式是不固定的,比如老师除了比较职称外,还可比较工龄大小,年龄大小等.则定义Com ...

  6. Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...

  7. Java-马士兵设计模式学习笔记-代理模式-动态代理 调用Proxy.newProxyInstance()

    一.概述 1.目标:不自己写代理类,利用Proxy.newProxyInstance()动态生成 2.用到的知识点: (1)//编译源码,生成class,注意编译环境要换成jdk才有compiler, ...

  8. Java-马士兵设计模式学习笔记-建造者模式

    一.概述 二.代码 1.Animal.java public interface Animal { public void bark(); } 2.Dog.java public class Dog ...

  9. Java-马士兵设计模式学习笔记-代理模式-动态代理 修改成可以任意修改代理逻辑

    一.概述 1.目标:动态代理的代理逻辑可以任意修改 2.思路: (1)要把代理逻辑抽离,站在jvm的角度思考,应独立出InvocationHandler接口,并接收被代理的对象及方法作为参数invok ...

随机推荐

  1. LeetCode OJ:Binary Tree Paths(二叉树路径)

    Given a binary tree, return all root-to-leaf paths. For example, given the following binary tree: 1 ...

  2. LeetCode OJ:Balanced Binary Tree(平衡二叉树)

    Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary ...

  3. 魔法效果——dijkstra+堆(邻接表存储)

    dijkstra本身每次要for一遍,才能找出最小的节点,但用了堆之后,直接取出堆首就可以了. 但要注意的一点是,c++自带的stl里的priority_queue本身是先入大出的,而我们要求的是最小 ...

  4. 基于zepto移动4*3九宫格转奖

    最近根据公司需求,要把移动端的圆形转盘抽奖,改为九宫格的形式,查找资料搞定了,纪录下demo代码. 页面的展现样式,如下 比较简单,就是红色的背景图,在这10个格子里转动 具体代码如下 html &l ...

  5. set/multiset和map/multimap用法小结

    二叉搜索树是ACM中经常需要用到的数据结构,熟练掌握map和set的用法很关键,现对其做一个简单的总结. 主要的功能有:插入元素,查找元素,删除,遍历/反向遍历. 插入,删除和查找操作的时间都和树的高 ...

  6. 关于/usr/bin/ld: cannot find -lcrypto 的错误

    Linux下 build code 时,要做 -lssl, -lcrypto 的链接,出现类似下面的错误: /usr/bin/ld: cannot find -lcrypto /usr/bin/ld: ...

  7. markdown的学习

    开始 语法 编辑器 sublime配置 图床 体验 开始 昨天晚上加上今天上午,折腾了算是一天的markdown编辑器. 原因是,为了写博客.在博客园写的东西,想法不到简书里,结果发现有部分乱码,以及 ...

  8. PCIe相关的操作命令

    1.lspci        --显示列举系统目前的pcie设备    43:00.0 Class 0004: Device 104c:b800 (rev 01)    //netra设备 设备编号 ...

  9. (转)list_orderby

    本文转载自:http://blog.csdn.net/liyifei21/article/details/6558098 一个条件排序情况 list.OrderBy(item => tem.St ...

  10. 机器学习:逻辑回归(scikit-learn 中的逻辑回归)

    一.基础理解 使用逻辑回归算法训练模型时,为模型引入多项式项,使模型生成不规则的决策边界,对非线性的数据进行分类: 问题:引入多项式项后,模型变的复杂,可能产生过拟合现象: 方案:对模型正则化处理,损 ...