在网上搜了下,发现没有关于数组实现迭代的相关文章,所以自己写了下。
主要是模仿的一个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() 这个方法
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,可查看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 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源码,是有收获的!~