1. 程式人生 > >陣列線性表ArrayList類(運用與API實現)

陣列線性表ArrayList類(運用與API實現)

ArrayList類是個很有用的儲存物件的類,可以儲存不限定個數的物件。

其中,用add方法可以將Object的任一例項加入線性表中(例如String是Object的一個子類,所以字元可以加入到線性表中),因此一個線性表中可以有不同型別的資料。

這裡簡單提一下Object類:Object類是所有Java類的祖先,每個類都使用 Object 作為超類。所有物件(包括陣列)都實現這個類的方法。該類最常用的方法就是toString()和equals(),但toString()由於輸出沒意義,一般被子類方法覆蓋。

public class Text {    
	public static void main(String[] args) { 
		java.util.ArrayList cityList=new java.util.ArrayList();
		cityList.add(1);
		cityList.add(2);
		cityList.add(3);
		cityList.add(4);
		cityList.add(5);
		System.out.println("Listsize:"+cityList.size());
		System.out.println("Is 9 contains ? "+cityList.contains(9));
		System.out.println("The location of 3 : "+cityList.indexOf(3));
		System.out.println("Is the list empty ? "+cityList.isEmpty());
		cityList.remove(2);
		System.out.println(cityList.toString());
		for(int i=0;i<cityList.size();i++)
			System.out.print(cityList.get(i)+" ");
		System.out.println();
		java.util.ArrayList circleList=new java.util.ArrayList();
		circleList.add(new Circle(2.0));
		circleList.add(new Circle(3.0));
		System.out.println(((Circle)circleList.get(0)).getRadius());
		//attention!!!circleList.get(0)是Object類的,要顯式轉換為Circle類才可呼叫getRadius
	 }
}
class Circle {
	private double radius;
	Circle(){	
		this(1.0);
	}
	Circle(double radius){
		this.radius=radius;
	}
	Circle(double radius,String color,boolean filled){
		this.radius=radius;
	}
	public double getRadius() {
		return radius;
	}
}

實現結果:

實現完該類的運用後,我用陣列寫了一個能實現大部分功能的ArrayList類。

class ArrayList{
	private Object[] element;
	private int size;
	public static final int SIZE_OF_ARRAY=10;
	ArrayList(){
		element=new Object[SIZE_OF_ARRAY];
	}
	public void add(Object o) {
		if(size>=element.length) {//需要擴容
			Object[] temp=new Object[element.length*2];
			for(int i=0;i<element.length;i++)
				temp[i]=element[i];
			element=temp;
		}			
		element[size++]=o;
	}
	public void add(Object o,int index) {
		if(index>=size) {
			System.out.println("IndexOutofBounds!");
			return;
		}
		if(size>=element.length) {//需要擴容
			Object[] temp=new Object[element.length*2];
			for(int i=0;i<element.length;i++)
				temp[i]=element[i];
			element=temp;
		}
		for(int i=size-1;i>=index;i--)
			element[i+1]=element[i];
		element[index]=o;
		size++;
	}
	public void clear() {
		element=new Object[element.length];
		size=0;
	}
	public void remove(int index) {
		if(isEmpty()) {
			System.out.println("ArrayisEmpty!");
			return;
		}
		else if(index>=size) {
				System.out.println("IndexOutofBounds!");
				return;
			}
		else {
			for(int i=index;i<size-1;i++)
				element[i]=element[i+1];
			size--;
		}
	}
	public void remove(Object o) {
		if(isEmpty()) {
			System.out.println("ArrayisEmpty!");
			return;
		}
		for(int i=0;i<element.length;i++)
			if(element[i]==o) {
				for(int j=i;j<size-1;j++)
					element[j]=element[j+1];
				size--;
			}
	}
	public boolean contains(Object o) {
		boolean flag=false;
		for(int i=0;i<size;i++)
			if(element[i]==o) {
				flag=true;
				break;
			}
		return flag;
	}
	public Object get(int index) {
		return element[index];
	}
	public void set(int index,Object o) {
		if(index>=size) {
			System.out.println("IndexOutofBounds!");
			return;
		}
		element[index]=o;
	}
	public int size() {
		return size;
	}
	public boolean isEmpty() {
		if(size==0)
			return true;
		else 
			return false;
	}
	public int indexOf(Object o) {
		int index=-1;//不存在就返回-1
		for(int i=0;i<size;i++)
			if(element[i]==o) {
				index=i;
				break;
			}
		return index;
	}
	public int lastIndexOf(Object o) {
		int index=-1;//不存在就返回-1
		for(int i=0;i<size;i++)
			if(element[i]==o)
				index=i;
		return index;
	}
	public String toString() {
		String s="[";
		for(int i=0;i<size-1;i++)
			s+=element[i]+", ";
		s+=element[size-1]+"]";
		return s;
	}
}

寫完後先與之前的結果進行橫向對比,得到一樣的結果:


於是修改測試程式碼如下:

ArrayList testList=new ArrayList();
testList.add(1);
testList.add(2);
testList.add(3);
testList.add(4);
testList.add(5);
testList.add("six");
testList.add("seven");
testList.add("eight");
testList.add("nine");
testList.add("ten");
testList.add(false);
testList.add('c');
System.out.println("Listsize:"+testList.size());
System.out.println("Is 9 contains ? "+testList.contains(9));
System.out.println("The location of 3 : "+testList.indexOf(3));
System.out.println("Is the list empty ? "+testList.isEmpty());
testList.remove(2);
System.out.println(testList.toString());
for(int i=0;i<testList.size();i++)
	System.out.print(testList.get(i)+" ");
System.out.println();
ArrayList testcircleList=new ArrayList();
testcircleList.add(new Circle(2.0));
testcircleList.add(new Circle(3.0));
System.out.println(((Circle)(testcircleList.get(0))).getRadius());
System.out.println(testList.contains(false));
System.out.println(testList.indexOf("nine"));
testList.clear();
System.out.println(testList.size());

得到結果:


完全正確!完成了ArrayList類的實現。