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 <T> * 我们有时候希望迭代器迭代的不仅仅是正向 而且也希望在迭代器中增加一些新的方法...那么就是用适配器模式 * 因为我们知道默认for 之所以能迭代 集合原因是集合实现了Iterable接口 并且实现了 iterator方法 .. * 因为我们想要多种功能所以我们不可以覆盖 iterator方法 .. 因为一旦覆盖那么..原来的功能就没有.. * 这时候我们就可以通过返回一个实现了Iterable接口的内部类...因为我们知道内部类可以操作外围类 * 并且有一切权限. 进而为我们适配提供了基础 * .因为我们迭代的就是实现Iterable的集合 ..而我们返回的内部类 也是实现了Iterable的类..但是我们 * 也完全可以操作外围类..所以完全可以实现我们自己的迭代功能。。 * 在使用Arrays.asList(T...e)的时候注意 ..这个工具方法返回的是实际封装底层数据的一个列表..我们队返回列表的操作也会反映到原始数组上 。。。 * 我想是在List内部维护 private transient Object[] elementData;如此声明的数组引用..直接引用了 我们的数组对象./ * 要记住的一点在java中除了基本数据类型 一切皆是对象。。。所以可以维护到程序结束。。 * Collecion.toArray()转换成数组的时候 返回的是容器内部数据的一个副本数组 * */ public class MyIterator<T> extends ArrayList<T> { private static final long serialVersionUID = 1L; @Override public Iterator<T> iterator() { //正向 // TODO Auto-generated method stub return super.iterator(); } public Iterable<T> shuffledIterator(){ //乱序 return new Iterable<T>() {@Override
public Iterator<T> iterator() { //toArray之所以是安全的因为它会分配一个新的副本 Collections.shuffle(Arrays.asList(MyIterator.this.toArray())) ; //所以这里的操作不会影响到实际容易中的元素 。。。这里不对 return MyIterator.this.iterator() ; } }; } public Iterable<T> reserveIterator() //反响迭代器 { return new Iterable<T> (){ @Override public Iterator<T> iterator() { // TODO Auto-generated method stub return new Iterator<T> (){ 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<String> my=new MyIterator<String>(){ 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<String> li=Arrays.asList(str) ; Collections.shuffle(li); System.out.println(Arrays.toString(str)); } }