Collection的迭代器实现

集合的遍历方法

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() + "我是:");

        }

猜你喜欢

转载自blog.csdn.net/wei_ai_n/article/details/61915208