数组的再次学习,类定义数组

一、数组核心概念
1.数组是什么?
数组是内存中用来存储数据的一段连续固定长度空间,有长度、存储数据容量、下标等属性。

2.数组优点
a、数组能存储大量数据,我们可以按照索引遍历数组中的元素。

b、数组是一个简单的线性序列,我们可以按照索引对数组中的元素进行增、删、查、取等操作。

c、由于我们可以通过下标对数组元素进行一次性操作,所以数组的时间复杂度为O1。

3.数组缺点
a、数组的长度固定,其大小一经确定就不能改变。

b、数组相对于链表,其插入元素、增删元素、查找元素慢。

c、数组不好管理。

4.数组用处
在进行模型设计、已知数据量规模或用来临时存储少量数据时可以使用数组,简化算法。

二、封装一个自定义数组类MyList
1.数组属性定义
数组存储数据的结构(数组类型为Object(所有类的父类))、长度、已存储数据量、下标。
 


Object[] valueArray={};//数组初始化时最好加上{}防止报空指针错误
int length;
int size;
int index;
int defaultlength=10;//默认长度

2.数组初始化方法


public void initArray() {
		length=defaultlength;
		valueArray=new Object[length];
		size=0;
		index=0;		
}
public MyList(){
		initArray();
}

3.数组扩容方法

在数组已满的情况下,往数组中增加元素会出现越界错误。此时需要对数组进行扩容,创建一个更大容量的数组,将原数组中的数据遍历复制过去。再通过对象名赋值,将使用的数组替换为这个新创建的数组 。

public void grow() {
		System.out.println("扩容前:"+length);
		int newlength=length*2;
		length=newlength;//容量更改
		Object[] newArray=new Object[length];//定义新数组
		//循环遍历 将原数组元素值赋值到扩容数组中 实现copy操作
		for(int i=0;i<valueArray.length;i++) {
			newArray[i]=valueArray[i];
		}
		//替换引用
		valueArray=newArray;
		System.out.println("扩容后:"+length);
	}

 

4.增加元素方法

增加数据时考虑容量有限,对数组进行扩容操作。

public void add(Object value) {
		if(size>=length) {//判断是否跨界 跨界则对数组进行扩容 
			grow();	
		}
		valueArray[index]=value;
		size++;
		index++;
	}

5.删除元素方法

 删除元素时同样需要考虑是否越界,然后根据索引值删除元素,删除元素后后面元素的索引值往前移

//数组减元素方法 根据索引值删除元素 后面元素的索引值往前移 同样考虑是否越界
	public void delete(int index) {
		if(index<0||index>=size){
			System.out.println("输入索引错误:越界");
		}else if(index==size-1){//删除最后一个元素 后面无元素补上其位置 所以将其设置为空值null
			valueArray[index]=null;
		}else {//删除中间元素 后面元素补上已删元素的位置
			valueArray[index]=valueArray[index+1];	
		}
		size--;
	}

6.替换元素方法


public void swap(int index,Object value) {
		if(index<0||index>this.length){
			System.out.println("输入索引错误:越界");
		}else {
			valueArray[index]=value;
		}		
	}

7.元素排序方法

采用冒泡排序法,比较数组中相邻元素,如果前面元素小于后面元素,那么将两个元素位置互换,使元素按从大到小进行排列。

//排序 从大到小进行排序(Object类型如何转换成int类型进行比较?)
	public void sort(){
		//对数组进行遍历 定义数组比较的两个元素 
		for(int i=0;i<valueArray.length-1;i++) {//第一个元素从数组第一个元素取至数组倒数第二个元素
			for(int j=i+1;j<valueArray.length;j++) {//第二个元素从第一个元素后一个元素取至数组最后一个元素
				if(((Integer)valueArray[i])<((Integer)valueArray[j])){//强制转换成int类型进行比较
					int temp=(Integer)valueArray[i];//现将大的放至空容器中
					valueArray[i]=(Integer)valueArray[j];//原大的赋值给原小的
					valueArray[j]=temp;//完成交换	
				}
			}
		}
	}

 8.数组合并方法

//合并其他数组或者队列对象
	public void merge() {
		int[] valueArray0= {20,30,40,50,60,70,80};
		if(size>=length) {
			grow();
		}
		for(int inx=0;inx<valueArray0.length;inx++) {
			add(valueArray0[inx]);//调用前已构造的add方法
		}
	}

9.获取元素方法

通过下标获取元素

public Object get(int index) {
		if(index>=0&&index<this.index) {
			return valueArray[index];
		}else {
			System.out.println("输入下标错误:越界");
		}
		return null;//报错
		}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值