数组线性表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类的实现。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值