迭代器Iterator的简单实现
来源:互联网 发布:女生裹被走红网络 编辑:程序博客网 时间:2024/05/22 13:19
一、一个简单使用 Iterator 迭代器的代码
List list= new ArrayList(); list.add("aaa"); list.add("bbb"); list.add("ccc"); //(1)通过循环遍历List for(int i=0;i<list.size();i++){ System.out.println(list.get(i)); } //(2)通过迭代器遍历List for(Iterator it= list.iterator(); it.hasNext(); ){ String str = (String) it.next(); System.out.println(str); }
1、所有实现了Collection接口的容器类,都有一个iterator方法,用以返回一个实现了Iterator接口的对象。
2、Iterator对象称作 迭代器 ,用以方便的实现对容器内部元素的遍历操作。
3、Iterator接口定义了如下方法:
boolean hasNext(); 判断是否有元素没有被遍历Object next(); 返回游标当前位置的元素,并将游标移动到下一个位置void remove(); 删除游标左面的元素(刚刚遍历完的那个元素),在执行完next之后该操作只能执行一次
(1)简单实现迭代器的三大函数
public class IteratorImp { private String[] elem={"a","b","c","d"}; private int size = elem.length; public int size(){ return size; } //计数器:指针、游标, 指向当前访问过的元素 private int coursor = -1; //判断是否存在下一个 public boolean hasNext(){ return (coursor+1)<size; } //获取下一个 public Object next(){ coursor++; return elem[coursor]; } //删除下一个 public void remove(){ //移动数组的元素 System.arraycopy(elem, coursor+1, elem, coursor, size-coursor-1); this.size--; //退回上一个访问的元素,即可实现多次删除 this.coursor--; } public static void main(String[] args) { // TODO Auto-generated method stub IteratorImp it =new IteratorImp(); while(it.hasNext()){ System.out.println((String) it.next()); } System.out.println("总共有"+it.size()+"个元素!"); }}
(2)改进版1:将这三个方法封装在一个非静态内部类中,作为迭代器对的实现
public class IteratorImp { private String[] elem={"a","b","c","d"}; private int size = elem.length; public int size(){ return size; } //私有,非静态内部类 private class myIterator implements Iterator{ //计数器:指针、游标, 指向当前访问过的元素 private int coursor = -1; //判断是否存在下一个 public boolean hasNext(){ return (coursor+1)<size; } //获取下一个 public Object next(){ coursor++; return elem[coursor]; } //删除下一个 public void remove(){ //移动数组的元素 System.arraycopy(elem, coursor+1, elem, coursor, size-coursor-1); size--; //退回上一个访问的元素,即可实现多次删除 this.coursor--; } } public Iterator iterator(){ return new myIterator(); } public static void main(String[] args) { IteratorImp list = new IteratorImp(); Iterator it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }}
(3)改进版2:由于该迭代器对象只在iterator方法中用到了,所以可以把它改成iterator方法中的局部内部类。
public class IteratorImp { private String[] elem={"a","b","c","d"}; private int size = elem.length; public int size(){ return size; } public Iterator iterator(){ //局部内部类:定义在方法里的类,仅在该方法中有效。他不属于外部类,因此不能用访问控制符和static修饰 class myIterator implements Iterator{ //计数器:指针、游标, 指向当前访问过的元素 private int coursor = -1; //判断是否存在下一个 public boolean hasNext(){ return (coursor+1)<size; } //获取下一个 public Object next(){ coursor++; return elem[coursor]; } //删除下一个 public void remove(){ //移动数组的元素 System.arraycopy(elem, coursor+1, elem, coursor, size-coursor-1); size--; //退回上一个访问的元素,即可实现多次删除 this.coursor--; } } return new myIterator(); } public static void main(String[] args) { IteratorImp list = new IteratorImp(); Iterator it = list.iterator(); while(it.hasNext()){ System.out.println(it.next()); } }}
(4)改进版3:由于Iterator接口的实现类myIterator在程序中只是用了一次,因此可以进一步改成匿名内部类。
public class IteratorImp {private String[] elem={"a","b","c","d"};private int size = elem.length;public int size(){return size;}public Iterator iterator(){return new Iterator(){ //创建Iterator迭代器接口的实现类(没有名称)的对象//计数器:指针、游标, 指向当前访问过的元素private int coursor = -1;//判断是否存在下一个public boolean hasNext(){return (coursor+1)<size;}//获取下一个public Object next(){coursor++;return elem[coursor];}//删除下一个public void remove(){//移动数组的元素System.arraycopy(elem, coursor+1, elem, coursor, size-coursor-1);size--;//退回上一个访问的元素,即可实现多次删除this.coursor--;}};}public static void main(String[] args) {IteratorImp list = new IteratorImp();Iterator it = list.iterator();while(it.hasNext()){System.out.println(it.next());}}}
(5)改进版4:
前面4种实现方法中,均在String数组已知的条件下,进行遍历的。
我们实现一个可以向字符串数组中添加删除元素的类,相当于一个String集合。并实现使用foreach对集合元素进行遍历。
/** * 目标:深入迭代器原理 --> 一个容器可以创建多个迭代器对象 * * 深入 * 1、使用内部类实现迭代器 * 2、继承接口java.lang.Iterable,实现foreach循环迭代访问集合元素 * 3、加入末尾添加元素的方法add() * @author Administrator * */public class StringCollection implements java.lang.Iterable {private String[] elem= new String[5];private int size;public int size(){return this.size;}public boolean add(String s){if(this.size==elem.length){//String数组容量不够了,就扩容elem=Arrays.copyOf(elem, elem.length+5);}elem[size++]=s;return true;}/* ...其他方法get、remove、clear等方法就不再赘述了... */public Iterator iterator(){return new Iterator(){ //创建Iterator迭代器接口的实现类(没有名称)的对象//计数器:指针、游标, 指向当前访问过的元素private int coursor = -1;//判断是否存在下一个public boolean hasNext(){return (coursor+1)<size;}//获取下一个public Object next(){coursor++;return elem[coursor];}//删除下一个public void remove(){//移动数组的元素System.arraycopy(elem, coursor+1, elem, coursor, size-coursor-1);size--;//退回上一个访问的元素,即可实现多次删除this.coursor--;}};}public static void main(String[] args) {StringCollection s = new StringCollection();s.add("111");s.add("222");s.add("222");s.add("222");s.add("222");s.add("222");s.add("222");System.out.println(s.size());//使用Java 5 提供的 foreach 循环迭代访问集合元素List list1 = new ArrayList();list1.add("123");list1.add("222");list1.add(s);for(Object obj:list1){System.out.println(obj);}//如果迭代访问我们创建的StringCollection集合的元素,可以吗?//会提示错误:an only iterate over an array or an instance of java.lang.Iterable//因此,只需要在类定义时继承接口java.lang.Iterable即可for(Object obj:s){System.out.println((String)obj);}}}
7123222com.yuan.Iterator.StringCollection@515632d111222222222222222222
(6)使用泛型
/** * 目标:使用泛型,可以操纵多个类型 * */public class ArrayList007<E> implements java.lang.Iterable {private Object[] elem= new Object[5];//泛型没有数组,因此使用Object数组private int size;public int size(){return this.size;}public boolean add(E ele){if(this.size==elem.length){//String数组容量不够了,就扩容elem=Arrays.copyOf(elem, elem.length+5);}elem[size++]=ele;return true;}/* ...其他方法get、remove、clear等方法就不再赘述了... */public Iterator<E> iterator(){return new Iterator<E>(){ //创建Iterator迭代器接口的实现类(没有名称)的对象//计数器:指针、游标, 指向当前访问过的元素private int coursor = -1;//判断是否存在下一个public boolean hasNext(){return (coursor+1)<size;}//获取下一个public E next(){coursor++;return (E) elem[coursor];}//删除下一个public void remove(){//移动数组的元素System.arraycopy(elem, coursor+1, elem, coursor, size-coursor-1);size--;//退回上一个访问的元素,即可实现多次删除this.coursor--;}};}public static void main(String[] args) {ArrayList007<String> s = new ArrayList007<String>();s.add("111");s.add("222");s.add("222");//System.out.println(s.size());Iterator<String> it = s.iterator();while(it.hasNext()){System.out.println(it.next());}ArrayList007<Integer> s2 = new ArrayList007<Integer>();s2.add(1); //int-->Integer自动装箱s2.add(2);for(Object i:s2){System.out.println(i);}}}
11122222212
阅读全文
0 0
- 迭代器Iterator的简单实现
- iterator的简单实现
- 迭代器,iterator的最简单实现
- 迭代器(Iterator)的简单实现
- Iterator(迭代器)的简单使用
- LinkedList以及Iterator的简单实现
- STL 简单 iterator adapters 的实现
- 迭代器Iterator与ListIterator的简单应用;
- C++迭代器(iterator)的简单使用
- Iterator的简单用法
- 一个实现了iterator模式的简单模板类
- STL 简单 iterator 的实现(含源码)
- Java集合Iterator迭代器的实现
- Iterator接口的简单用法
- c++ iterator的简单范例
- C++设计模式Visitor+Iterator简单实现
- 标准库容器 vector 和 迭代器 iterator 的简单介绍
- STL iterator的自己实现
- POI实现excel导入
- Photoshop 高清人像精修教程
- 公网访问专线内网解决方案
- android之网络状态判断(wifi和移动网络数据)
- Android File类 根据官方文档理解(转)
- 迭代器Iterator的简单实现
- expdp导出
- jsPlumb 拖拽效果限定范围
- JNI方法的Signature
- 使用sp_xml_preparedocument处理XML文档 保存到sqlserver中
- Android 沉浸式状态栏-字体颜色与背景颜色修改实现与兼容
- C++ Json 的几个操作
- MediaPlayer本地播放流程解析(1)
- 计算机视觉与深度学习(5)