• 自定义实现迭代器——高淇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 }
  • 相关阅读:
    AngularJs 与Jquery的对比分析,超详细!
    身份证号验证,获取户口地址、性别、出生日期
    前端面试·
    页面可见性(Page Visibility API) 可以有哪些用途?
    webSocket如何兼容低浏览器?(阿里)
    如何实现浏览器内多个标签页之间的通信?
    HTML5的form如何关闭自动完成功能?
    Label的作用是什么?是怎么用的?
    cookies,sessionStorage 和 localStorage 的区别?
    浏览器是怎么对HTML5的离线储存资源进行管理和加载的呢?
  • 原文地址:https://www.cnblogs.com/swimminglover/p/8313400.html
Copyright © 2020-2023  润新知