自定义实现迭代器——高淇JAVA300讲笔记之迭代器

        这段代码分别以不同的方式实现了iterator()方法,实现了add()方法在末尾添加元素。自定义的Iterator对象具有hasNext()、next()、remove()方法。数组的拷贝用到了Arrays.copyOf方法,这个方法传回的数组是一个新的数组对象。

  1 package com.bjsxt.iter;
  2 
  3 import java.util.ArrayList;
  4 import java.util.Arrays;
  5 import java.util.Iterator;
  6 
  7 /**
  8  * 目标:深入迭代器的原理  --> 一个容器可以创建多个迭代器对象
  9  * 途径:使用了 内部类 |匿名内部类
 10  * 
 11  * 深入:
 12  * 1.使用内部类 实现迭代器
 13  * 2.使用Iterable 实现foreach迭代
 14  * 3.加入末尾添加元素的方法
 15  * 
 16  *
 17  */
 18 public class SxtDeepList implements java.lang.Iterable{
 19     //数组 存储值
 20     private String[] elem = new String[5];
 21     //实际大小
 22     private int size = 0;
 23     
 24     public int size() {
 25         return this.size;
 26     }
 27     
 28     /**
 29      * 在末尾添加元素
 30      * @param ele
 31      */
 32     public void add(String ele) {
 33         if(this.size == elem.length) {  //容量不够 --> 扩容
 34             elem = Arrays.copyOf(elem, elem.length+5);
 35             
 36         }
 37         
 38         elem[size] = ele;  //数组中加入元素 加到最后
 39         size++;//实际大小+1
 40     }
 41     
 42     //内部类
 43     private class MyIter implements Iterator {
 44         //计数器 就是指针 游标
 45         private int cursor = -1;
 46         //判断是否存在下一个
 47         public boolean hasNext() {
 48             return cursor+1 < size;
 49         }
 50         //获取下一个
 51         public String next() {
 52             cursor++;
 53             return elem[cursor];
 54         }
 55         //删除下一个
 56         public void remove() {
 57             //移动数组元素
 58             System.arraycopy(elem, 
 59                     cursor+1, elem, cursor, 
 60                     size-(cursor+1));
 61             //实际大小-1
 62             size--;
 63             //回退
 64             this.cursor--;
 65         }
 66     }
 67     
 68     public Iterator iterator1() {
 69         return new MyIter();
 70     }
 71     
 72     public Iterator iterator2() {
 73         class MyIter implements Iterator {
 74             //计数器 就是指针 游标
 75             private int cursor = -1;
 76             //判断是否存在下一个
 77             public boolean hasNext() {
 78                 return cursor+1 < size;
 79             }
 80             //获取下一个
 81             public String next() {
 82                 cursor++;
 83                 return elem[cursor];
 84             }
 85             //删除下一个
 86             public void remove() {
 87                 //移动数组元素
 88                 System.arraycopy(elem, 
 89                         cursor+1, elem, cursor, 
 90                         size-(cursor+1));
 91                 //实际大小-1
 92                 size--;
 93                 //回退
 94                 this.cursor--;
 95             }
 96         }
 97         return new MyIter();
 98     }
 99     
100     public Iterator iterator() {
101         return new Iterator() {//创建Iterator迭代器接口实现类(没有名称)的对象
102             //计数器 就是指针 游标
103             private int cursor = -1;
104             //判断是否存在下一个
105             public boolean hasNext() {
106                 return cursor+1 < size;
107             }
108             //获取下一个
109             public String next() {
110                 cursor++;
111                 return elem[cursor];
112             }
113             //删除下一个
114             public void remove() {
115                 //移动数组元素
116                 System.arraycopy(elem, 
117                         cursor+1, elem, cursor, 
118                         size-(cursor+1));
119                 //实际大小-1
120                 size--;
121                 //回退
122                 this.cursor--;
123             }
124         };
125     }
126     
127     public static void main(String[] args) {
128         SxtDeepList list = new SxtDeepList();
129         list.add("a");
130         list.add("b");
131         list.add("c1");
132         list.add("c2");
133         list.add("c3");
134         list.add("c4");
135         list.add("c5");
136         Iterator it = list.iterator();
137         while(it.hasNext()) {  //先判断 后获取
138             System.out.println(it.next());
139             it.remove();
140         }
141         System.out.println(list.size());
142         
143         for(Object str:list) {
144             System.out.println(str);
145         }
146         
147         
148         ArrayList list2 = new ArrayList();
149         list2.add("a");
150         list2.add("a");
151         list2.add("a");
152         for(Object obj:list2) {  //foreach
153             System.out.println(obj);
154         }
155     }
156 }
原文地址:https://www.cnblogs.com/swimminglover/p/8313400.html