自己实现一个java迭代器_java+适配器模式 实现自己的迭代器...

package me;

import java.util.ArrayList;

import java.util.Arrays;

import java.util.Collections;

import java.util.Iterator;

import java.util.List;

/**

* @author xiaowei

* @param

* 我们有时候希望迭代器迭代的不仅仅是正向 而且也希望在迭代器中增加一些新的方法...那么就是用适配器模式

* 因为我们知道默认for 之所以能迭代 集合原因是集合实现了Iterable接口 并且实现了 iterator方法 ..

* 因为我们想要多种功能所以我们不可以覆盖 iterator方法 .. 因为一旦覆盖那么..原来的功能就没有..

* 这时候我们就可以通过返回一个实现了Iterable接口的内部类...因为我们知道内部类可以操作外围类

* 并且有一切权限.  进而为我们适配提供了基础

* .因为我们迭代的就是实现Iterable的集合 ..而我们返回的内部类 也是实现了Iterable的类..但是我们

* 也完全可以操作外围类..所以完全可以实现我们自己的迭代功能。。

* 在使用Arrays.asList(T...e)的时候注意 ..这个工具方法返回的是实际封装底层数据的一个列表..我们队返回列表的操作也会反映到原始数组上 。。。

* 我想是在List内部维护    private transient Object[] elementData;如此声明的数组引用..直接引用了 我们的数组对象./

* 要记住的一点在java中除了基本数据类型 一切皆是对象。。。所以可以维护到程序结束。。

* Collecion.toArray()转换成数组的时候 返回的是容器内部数据的一个副本数组

*

*/

public class MyIterator extends ArrayList {

private static final long serialVersionUID = 1L;

@Override

public Iterator  iterator() {   //正向

// TODO Auto-generated method stub

return super.iterator();

}

public Iterable  shuffledIterator(){  //乱序

return new Iterable() {

@Override

public Iterator iterator() {  //toArray之所以是安全的因为它会分配一个新的副本

Collections.shuffle(Arrays.asList(MyIterator.this.toArray())) ;  //所以这里的操作不会影响到实际容易中的元素 。。。这里不对

return  MyIterator.this.iterator() ;

}

};

}

public Iterable  reserveIterator()    //反响迭代器

{

return new Iterable  (){

@Override

public Iterator  iterator() {

// TODO Auto-generated method stub

return new Iterator (){

int cur=size()-1;

@Override

public boolean hasNext() {

return cur>=0 ;

}

@Override

public T next() {

return get(cur--);

}

@Override

public void remove() {

throw new UnsupportedOperationException() ;

}

};

}

};

}

public static void main(String[]agrs){

MyIterator my=new MyIterator(){

private static final long serialVersionUID = 1L;

{

add("zhangsan") ;

add("lise")  ;

add("wangwu") ;

add("maliu") ;

add("xiaoxue") ;

}

} ;

for(Object obj:my.reserveIterator()){

System.out.print(obj+" ");

}

System.out.println("\n");

for(Object obj:my.shuffledIterator()){

System.out.print(obj+" ");

}

//下面说明了  Arrays.asList()实际是按照底层数据返回列表的..所以我们在打乱了列表的顺序的同时 也就打乱了底层的数据...下面代码可以看到

String[] str ={"one","two","three","four","five","six","seven"} ;

List li=Arrays.asList(str) ;

Collections.shuffle(li);

System.out.println(Arrays.toString(str));

}

}

作者:yue7603835 发表于2012-6-23 20:49:09 原文链接

阅读:0 评论:0 查看评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值