在網上搜了下,發現沒有關於數組實現迭代的相關文章,所以自己寫了下。
主要是模仿的一個Arraylist 實現的主要的功能!
代碼如下:
首先建個介面:
package com.list;public interface List<T> extends Iterable<T>{ void add(T e); void remove(T t); void removeAt(int index); int size(); void clear(); int indexOf(Object object); void set(T e,int index);}
第二部建立ArrayList類:
package com.list.impl;import java.util.Iterator;import com.list.List;public class ArrayList<T> implements List<T> {Object [] objects=new Object[0];public void add(T t) {// TODO Auto-generated method stubObject [] tmp=new Object[objects.length+1];tmp[tmp.length-1]=t;System.arraycopy(objects, 0, tmp, 0, objects.length);objects=tmp;}@Overridepublic void remove(T t) {// TODO Auto-generated method stubfor(int i=0;i<objects.length;i++){if(objects[i].equals(t)){if(i>0){Object object[]=new Object[objects.length-1];System.arraycopy(objects, 0, object, 0, i);System.arraycopy(objects, i+1, object, i, objects.length-i-1);objects=object;break;}}}}@Overridepublic void removeAt(int index) {// TODO Auto-generated method stubif(index>=0){Object object[]=new Object[objects.length-1];System.arraycopy(objects, 0, object, 0, index);System.arraycopy(objects, index+1, object, index, objects.length-index-1);objects=object;}}@Overridepublic int size() {// TODO Auto-generated method stubreturn objects.length;}@Overridepublic void clear() {// TODO Auto-generated method stubthis.objects=new Object[0];}@Overridepublic int indexOf(Object object) {// TODO Auto-generated method stubfor(int i=0;i<objects.length;i++){if(objects[i].equals(object)){return i;}}return -1;}@Overridepublic void set(T e, int index) {// TODO Auto-generated method stubobjects[index]=e;}@Overridepublic Iterator<T> iterator() {// TODO Auto-generated method stubIterator<T> iterator=new Iterator<T>() {int index=0;boolean hasNext=true;@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn hasNext;}@Overridepublic T next() {// TODO Auto-generated method stubif(index++<objects.length-1){hasNext=true;return (T)objects[index-1];}else {hasNext=false;return (T)objects[objects.length-1];}}@Overridepublic void remove() {// TODO Auto-generated method stubobjects=new Object[0];}};return iterator;}}
Arraylist需要實現iterator這個介面
這個介面有 這幾個方法
hasNext()
next()
remove()
hasNext 是否有下一條資料
next 擷取下一個對象
remove 移除全部
我們在類中實現iterator這個介面後,重寫public Iterator<T> iterator() 這個方法
Iterator<T> iterator=new Iterator<T>() {int index=0;boolean hasNext=true;@Overridepublic boolean hasNext() {// TODO Auto-generated method stubreturn hasNext;}@Overridepublic T next() {// TODO Auto-generated method stubif(index++<objects.length-1){//判斷是否超過數組hasNext=true;return (T)objects[index-1];}else {hasNext=false;return (T)objects[objects.length-1];//將數組對象轉換成泛型}}@Overridepublic void remove() {// TODO Auto-generated method stubobjects=new Object[0];//這是數組對象}};return iterator;
這樣就實現了一個簡單的Arraylist,可查看JDK的源碼,實現方法也是差不多的。
移除方法,官方的JDK源碼中,也是用
System.arraycopy(objects, 0, object, 0, index);
數組拷貝的方式實現的!
下面是我的使用和測試代碼:
package com.test;import com.list.*;import com.list.impl.ArrayList;public class Test {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubList<Object> list=new ArrayList<Object>();String str="張三";list.add(1);list.add(2);list.add(3);list.add(new Object());list.add(new Object());list.add(new Object());list.add(str);list.add("hello");list.remove(str);list.remove(str);list.removeAt(0);for (Object object : list) {System.out.println(object);}System.out.println(list.size());}}
可以看得出來,使用方法和官方是一樣的!
多看JDK源碼,是有收穫的!~