天天看點

貼一份代碼,示範java.lang.Iterable

可能大家都沒有注意,Collection接口的父接口是java.lang.Iterable

在這個接口中定義的是iterator方法

并且這個接口中指出 “實作這個接口允許對象成為 "foreach" 語句的目标”

這就是說,所有的集合類都要實作iterator方法

都可以傳回一個Iterator對象,完成疊代功能

下面寫一個示例代碼示範一下package iterator;

import java.util.Iterator;

/*

* Jimliu

*

* 這個例子為了試驗java.lang.Iterable接口中提到的:

*   實作這個接口允許對象成為 "foreach" 語句的目标。

* 自己實作一個儲存int資料的ArrayList,可以動态增長

* 擴容的算法是 size = size + size/2 + 1;

* 提供get/add/toString/size/iterator方法和兩種構造方式

* 實作Iterable接口,允許對象成為 "foreach"語句的目标(見測試類print3方法)

* 實作一個成員内部類Iterator(疊代器),通過它操作外部類的屬性,實作hasNext和next方法

*/

public class MyIntArrList implements Iterable

{

        private static final int DEFAULT_SIZE = 10; // 初始預設大小

        private int size; // 目前數組最大儲存多少元素

        private int[] arr; // 儲存int值的數組

        private int index; // 目前有效元素個數

        public int size()

        {

                return index;

        }

        public MyIntArrList()

                size = DEFAULT_SIZE;

                arr = new int[size];

                index = 0;

        public MyIntArrList(int size)

                if (size <= 0)

                {

                        throw new IllegalArgumentException("size must be > 0");

                }

                this.size = size;

                arr = new int[this.size];

        public void add(int n)

                if (index == size) // 檢視是否滿了

                        size = size + size / 2 + 1; // 擴容

                        int[] tmp = new int[size];

                        System.arraycopy(arr, 0, tmp, 0, index); // 拷貝

                        arr = tmp;

                arr[index] = n;

                index++;

        public int get(int ind)

                if (ind < 0 || ind >= index)

                        throw new ArrayIndexOutOfBoundsException(ind);

                return arr[ind];

        public String toString()

                StringBuffer sb = new StringBuffer("[");

                for (int i = 0; i < index; i++)

                        sb.append(arr[i]);

                        if (i != index - 1)

                                sb.append(", ");

                sb.append("]");

                return sb.toString();

        public Iterator iterator()

                return new MyIterator(); // 成員内部類MyIterator

        /*

         *  私有這個類,外界不能主動建立這個類的對象

         *  隻能通過外部類的iterator()方法傳回一個疊代器對象

         *  使用者得到這個疊代器類的對象後,

         *  可以調用公開的hasNext和next方法進行疊代操作

         *  remove方法沒有實作,抛出異常

         */

        private class MyIterator implements Iterator // 實作Iterator接口

                private int cnt = 0; // 目前疊代的下标

                public boolean hasNext()

                        return cnt != index; // 沒有疊代到最後就傳回true

                public Object next() // 儲存目前資料,對cnt++,然後傳回儲存好的資料

                        int n = arr[cnt];

                        cnt++;

                        return n;

                public void remove() // 不支援,抛出不支援操作異常

                        throw new UnsupportedOperationException();

}

複制代碼下面是這個類的測試類package iterator;

public class Test

        public static void main(String[] args)

                MyIntArrList ti = new MyIntArrList();

                for(int i=0; i<40; i++)

                        ti.add(i);

                System.out.println(ti.toString());

                print1(ti);

                print2(ti);

                print3(ti);

        // for get

        public static void print1(MyIntArrList ti)

                System.out.println("=== for get ===");

                for (int i=0; i<ti.size(); i++)

                        System.out.print(ti.get(i)+" ");

                System.out.println();

        // iterator

        public static void print2(MyIntArrList ti)

                System.out.println("=== iterator ===");

                Iterator it = ti.iterator();

                while(it.hasNext())

                        Object o = it.next();

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

        // foreach

        public static void print3(MyIntArrList ti)

                System.out.println("=== for each ===");

                for (Object o : ti)

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/814831,如需轉載請自行聯系原作者

繼續閱讀