陣列線性表ArrayList類(運用與API實現)
阿新 • • 發佈:2019-01-22
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類的實現。