Collection的迭代器实现

来源:互联网 发布:java 判断字段类型 编辑:程序博客网 时间:2024/06/02 04:21

集合的遍历方法

List<String> list = new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");方法一:超级for循环遍历for(String attribute : list) {  System.out.println(attribute);}方法二:对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:for(int i = 0 ; i < list.size() ; i++) {  system.out.println(list.get(i));}方法三:集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代Iterator it = list.iterator();while(it.hasNext()) {  System.ou.println(it.next);}

设计自己的Iterator迭代器

  • 设计自己的迭代器接口功能包括哪些功能
/** * Created by shiqiang on 2016/12/22. */public interface Iterator {    //前移    Object previous();    //后移    Object next();    //是否有下一个元素    boolean hasNext();    //取得第一个元素    Object first();}
  • 实现该接口的迭代器
/** * Created by shiqiang on 2016/12/22. */public class MyIterator implements Iterator {    private MyCollection myCollection;    //私有化一个变量    private int pos = -1;    //将集合传递进来    public MyIterator(MyCollection myCollection) {        this.myCollection = myCollection;    }    @Override    public Object previous() {        //前移将pos位置减一返回集合中的元素        if (pos > 0){            pos -- ;        }        return myCollection.get(pos);    }    @Override    public Object next() {        //后移将pos位置加一返回集合中的元素        if (pos < myCollection.size() - 1){            pos ++ ;        }        return myCollection.get(pos);    }    @Override    public boolean hasNext() {//        是否还有下一个元素,有返回true,否则为false        if (pos < myCollection.size() - 1){            return true ;        }else{            return false ;        }    }    @Override    public Object first() {        //返回集合中第一个位置的值        pos = 0 ;        return myCollection.get(pos);    }}
  • 集合的接口:注意需要哪些数据,在MyIterator中需要 myCollection.get(pos),myCollection.size() ,所以接口中应该此方法
/** * Created by shiqiang on 2016/12/22. */public interface Collection {    //集合的迭代器接口    public Iterator iterator();    //得到集合中的元素    public Object get(int i);    //得到集合的长度    public int size();}
  • 实现该接口的集合
/** * Created by shiqiang on 2016/12/22. */public class MyCollection implements Collection {    /*    由于List的add方法比较麻烦,所以这边只有固定数组来标示集合~List.add实现思路如下:    List集合的策略,初始一个数组长度,达到长度时new一个新数组,    新数组的长度是原数组长度的二倍,然后把原数组的内容复制到新数组,    再将新的元素加到数组中。其中肯定有一个变量来记录最后一个元素所在的数组下标。    */    public String string[] = {"A","B","C","D","E"};    @Override    public Iterator iterator() {        //将此集合传递进去,就像MVP模式一样的        return new MyIterator(this);    }    @Override    public Object get(int i) {        return string[i];    }    @Override    public int size() {        return string.length;    }}
  • 调用自己的集合跟迭代器遍历集合取出数据
 MyCollection myCollection = new MyCollection();//初始化自己的iterator,注意myCollection.iterator()返回的是 return new //MyIterator(this);实现了Iterator接口,父类指向子类,下面调用的是子类的方法! Iterator iterator = myCollection.iterator();//        System.out.println(iterator.first().toString() + "nimei");        while (iterator.hasNext()){            System.out.println(iterator.next() + "我是:");        }
0 0