java 陣列實現迭代方法 iterator,模仿Arraylist
阿新 • • 發佈:2019-01-25
在網上搜了下,發現沒有關於陣列實現迭代的相關文章,所以自己寫了下。
主要是模仿的一個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 stub Object [] tmp=new Object[objects.length+1]; tmp[tmp.length-1]=t; System.arraycopy(objects, 0, tmp, 0, objects.length); objects=tmp; } @Override public void remove(T t) { // TODO Auto-generated method stub for(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; } } } } @Override public void removeAt(int index) { // TODO Auto-generated method stub if(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; } } @Override public int size() { // TODO Auto-generated method stub return objects.length; } @Override public void clear() { // TODO Auto-generated method stub this.objects=new Object[0]; } @Override public int indexOf(Object object) { // TODO Auto-generated method stub for(int i=0;i<objects.length;i++){ if(objects[i].equals(object)){ return i; } } return -1; } @Override public void set(T e, int index) { // TODO Auto-generated method stub objects[index]=e; } @Override public Iterator<T> iterator() { // TODO Auto-generated method stub Iterator<T> iterator=new Iterator<T>() { int index=0; boolean hasNext=true; @Override public boolean hasNext() { // TODO Auto-generated method stub return hasNext; } @Override public T next() { // TODO Auto-generated method stub if(index++<objects.length-1){ hasNext=true; return (T)objects[index-1]; } else { hasNext=false; return (T)objects[objects.length-1]; } } @Override public void remove() { // TODO Auto-generated method stub objects=new Object[0]; } }; return iterator; } }
Arraylist需要實現iterator這個介面
這個介面有 這幾個方法
hasNext()
next()
remove()
hasNext 是否有下一條資料
next 獲取下一個物件
remove 移除全部
我們在類中實現iterator這個介面後,重寫public Iterator<T> iterator() 這個方法
這樣就實現了一個簡單的Arraylist,可檢視JDK的原始碼,實現方法也是差不多的。Iterator<T> iterator=new Iterator<T>() { int index=0; boolean hasNext=true; @Override public boolean hasNext() { // TODO Auto-generated method stub return hasNext; } @Override public T next() { // TODO Auto-generated method stub if(index++<objects.length-1){//判斷是否超過陣列 hasNext=true; return (T)objects[index-1]; } else { hasNext=false; return (T)objects[objects.length-1];//將陣列物件轉換成泛型 } } @Override public void remove() { // TODO Auto-generated method stub objects=new Object[0];//這是陣列物件 } }; return iterator;
移除方法,官方的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 stub
List<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原始碼,是有收穫的!~