用数组来实现表(ArrayList)

数组实现的表find(ith)操作只需花费O(1),但是插入和删除的花费却需要昂贵的开销,这要看插入在什么地方,最坏的情况下,在为置0插入(即在表的前端插入)首先需要 将整个数组后移一位,而删除第一个元素则需要将整个数组向前移动一个位置,这两种最坏的情况的花费为O(N)。

表的代码如下:
public class MyArrayList<T> 
{
	public static final int DEFAULT_CAPACITY=10;
	private int size;
	private T[] items;
	
	public void clear()
	{
		size=0;
		ensureCapacity(DEFAULT_CAPACITY);
	}
	
	public MyArrayList()
	{
		clear();
	}
	
	public boolean isEmpty()
	{
		return size==0;
	}
	
	public int size()
	{
		return size;
	}
	
	public void add(T x)
	{
		add(size,x);
	}
	
	public T get(int idx)
	{
		if(idx>=size || idx<0)
		{
			throw new ArrayIndexOutOfBoundsException();
		}
		return items[idx];
	}
	
	public void set(int idx,T x)
	{
		if(idx>=size || idx<0)
		{
			throw new ArrayIndexOutOfBoundsException();
		}
		items[idx]=x;
	}
	
	public void remove(int idx)
	{
		for (int i = idx; i < size-1; i++)
		{
			items[i]=items[i+1];
		}
		size--;
	}
	
	private void add(int idx,T x)
	{
		if(items.length==size())
		{
			ensureCapacity(size*2+1);
		}
		for (int i = size; i >idx; i++)
		{
			items[i]=items[i-1];
		}
		items[idx]=x;
		size++;
	}
	
	public void ensureCapacity(int newCapacity)
	{
		if(newCapacity<=size)
		{
			return;
		}
		T[] old=items;
		items=(T[])new Object[newCapacity];
		for (int i = 0; i < size; i++)
		{
			items[i]=old[i];
		}
	}
	
}

测试以上代码:
public class Text
{
	public static void main(String[] args)
	{
		MyArrayList<Integer> list=new MyArrayList<Integer>();
		list.add(5);
		list.add(3);
		list.add(7);
		list.add(7);
		list.add(90);
		for (int i = 0; i <list.size() ; i++)
		{
			System.out.print(list.get(i)+" ");
		}
		System.out.println();
		list.remove(0);
		for (int i = 0; i < list.size(); i++)
		{
			System.out.print(list.get(i)+" ");
		}
		list.set(2, 98);
		System.out.println();
		for (int i = 0; i < list.size(); i++)
		{
			System.out.print(list.get(i)+" ");
		}

	}

}
输出为:
5 3 7 7 90 
3 7 7 90 
3 7 98 90 


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值