动态数组设计

Array动态数组设计

在平时日常的撸代码中,我们比较常用的数据结构就是数组了吧(经常用这个数据结构进行测试),今天我们就一起来探讨一下关于数组的实现是怎么一回事。

首先我们先想一下关于动态数组的话应该设计一些哪些内容

属性部分:

1、数组的数量
private int size;
2、用来的存放数据容器
private <E>[] element;
3、数组的初始化容量
public static final int DEFAULT_CAPACITY = 10;
4、出现异常或者没有元素的返回情况
public static final int ELEMENT_NOT_FOUND = -1;//在这里我们记作-1

方法部分:

1、构造方法
public ArrayTest()
{
	this(DEFAULT_CAPACITY);//默认给定容量为10的数组
}

public ArrayTest(int capacity)//此处有参构造中的数据是为了给用户提供想要输入的数组大小
{
	//若用户给定的数据大于初始值(10)我们返回用户输入的值,不超过则按默认值(10)进行初始化
	capacity = (capacity > DEFAULT_CAPACITY)? capacity : DEFAULT_CAPACITY;
	elements = new Object[capacity];//给容器进行初始化
}
2、查询数组数量
public int size()
{
	return size;
}
3、查看元素中是否为空
public boolean isEmpty()
{
	return size == 0;
}
4、查询数组是否存在某个元素
public boolean contains(E element)
{
	return indexOf(element) != ELEMENT_NOT_FOUND;
}
5、获取元素的内容
public E get(int index){
	return elements[index];
}
6、修改元素内容
public E set(int index,E element){
	E old = elements[index];//最初值地址传给变量
	elements[index] = element;//把需要修改的值赋值给要修改的位置
	return old;//返回
}
7、数组下标越界问题(著名异常)
private void rangeCheck(int index)
{
	if(index < 0 || index > size){
	outOfBounds();//创建异常对象的方法
	}
}
8、异常创建
private void outOfBounds()
{
	throw new IndexOutOfBoundsException("Array subscript out of bounds");//创建异常并打印异常信息
}
9、数组扩容
private void ensureCapacity(int capacity)
{
	int oldcapacity = elements.length;//获取当前的长度/容量
	if(oldcapacity > capacity){//若数组容量大于输入的capacity,则直接返回
	return;
}
int newCapacity = oldcapacity + (oldcapacity/2);//扩容为原来的1.5倍
 E[] newElements = (E []) new Object[newCapacity];//新数组容量传给变量
 for(int i = 0;i < size;i++)
 {
	newElements[i] = elements[i];//数据拷贝到新的数组当中
}
  elements = newElements;
}
10、添加元素
public void add(int index,E element)
{
	rangeCheckAdd(index);//数组范围检查
	ensureCapacity(size + 1);//向后移动一位,是否需要扩容
	for(int i = size; i > index ;i--){
	elements[i] = elements[i-1];//满足条件 元素后移
}
	elements[index] = element;//元素赋值到指定位置
	size++;//容量增加
}
11、数组缩容(数据存储< 空间容量)
private void trimTosize()
{
	int oldCapacity = elements.length;
	int newCapacity = oldCapacity/2;
	if(size >= (newCapacity) || oldCapacity <= DEFAULT_CAPACITY)
	//size容量大于原容量的一半时,或者原容量小于10
	{
		return;
	}
 E[] newElement = (E[])new Object[newCapacity];//创建新的数组,容量为原来的一般
 	for(int i = 0;i < size;i++){
 		newElement[i] = elements[i];//遍历赋值
 	}
 	elements = newElement;
}
12、数组删除
public E remove(int index)
{
	rangeCheck(index);//属性检查
	trimTosize();//是否需要缩容
	E old =  elements[index];
	for(int i = index;i<size;i++)
	{
		elements[index] = elements[index + 1];
	}
	elements[--size] = null;
	return old;
}
13、查询元素位置
public void indexOf(E element)
{
	if(element == null)//判断是否为空
	{
		for(int i = 0;i<size;i++){
		if(element[i] == 0){//数据是否为空
		return i;
}
		}
		
	}else{//不为空的情况
for(int i = 0;i<size;i++){
	if(eleement.equals(elements[i]))//对比地址是否相同
	{
	return i;
	}
					}
}
	return ELEMENT_NOT_FOUND;//能到这里说明不上上述两类情况
}

上述类大概还有一些类没有写(拓展类,如removeAdd),基本的一些功能已经实现。

若上述内容出现问题,欢迎各位客官批评指正

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值