数组队列的学习(一)--数组中的增删查改

数组队列的学习(一)–数组中的增删查改

数组和队列的认识

数组

基本属性和方法
  • 属性: 元素个数,长度
  • 方法:Object类的方法
  • 使用难度和隐患:使用起来十分简单,所以相对的其安全性比较差;
创建和使用:
	//首先我们要声明它的数据类型,这里我们以int为其数据类型
	int[] onelist;
	//然后我们得创建这个数组对象,[]中的数便是这个数组的长度,确定之后内存空间便确定了
	onelist=new int[999];
	//然后就是数组中元素的调用,数组中以下标调用数据
	onelist[21]=100;//赋值
数组中常见报错
- 越界:从外向内操作 取用超出下标之外的内容
- 溢出:内部内存不够了--栈、堆

队列

  • 各种管理数组的方法:排序、增删查改、自动扩容、合并
数组的增删查改
  • 我们需要一个数组 MyList,以及一个接口List存有增删查改的方法
  • 接口的方法:增 删 查 改
  • MyList的属性:存储结构、Size元素数、 Length长度
  • MyList的初始化:根据传进的内容来初始化—长度、数组、链表、空参数
  • 注意:增删查改等方法自己编写时需要堤防传入数据的正确性!

数组的增删查改方法的编写

数组初始化
设置数组基本属性
 public MyList{
		//属性
	int length;//数组长度
	int size;//下标ta从0开始,元素个数ta从1开始

	//创建数组
	Object[] arrvalue;
	
	//默认参数
	//默认长度
	final int dflength=10;
	
	//获取长度和大小
	public int getlength(){
		return this.length;
	}
	public int getsize() {
		return this.size;
	}
	
	//初始化数组
	public MyList() {
		initList();
	}
	
	//默认初始化
	private void initList() {
		length=dflength;
		arrvalue=new Object[length];
		size=0;
	}
	
	public MyList(int initlength) {
		if(initlength<0) {
			System.err.println("输入的数长度小于零");
		}
		if(initlength>Integer.MAX_VALUE) {
			System.err.println("输入的数大于上限");
		}
		if(initlength<=dflength) {
			initList();
		}
		if(initlength>dflength) {
			length=dflength;
			arrvalue=new Object[length];
			size=0;
		}
		
	}
		//查看数组的数据
	public void check(MyList mylist) {
		System.out.println("元素个数:"+mylist.getsize());
		System.out.println("数组大小:"+mylist.getlength());
		System.out.print("数据数组为:");
		for(int i=0;i<arrvalue.length;i++) {
			System.out.print(arrvalue[i]+"  ");
		}
		System.out.println( );
	}
	
}
  • 需要判断输入的数据正确性
  • 判断内存是否已满–自动扩容
  • 将数据加入数组
	//数组扩展
	public void grow() {
		int oldlength=length;
		int newlength=(oldlength>>1)+oldlength;
		//将增加的长度替换的长度
		length=newlength;
		//创建新数组设置扩容后的length
		Object[] newarrvalue=new Object[newlength];
		//将原来的数组值赋值给新数组
		for(int i=0;i<arrvalue.length;i++) {
			newarrvalue[i]=arrvalue[i];
		}
		//将新的数组替换原来数组
		arrvalue=newarrvalue;
		newarrvalue=null;
		System.out.println();
		System.out.println("扩容后数组大小:"+getlength());
}
	//增
	public void add(Object value) {
		//判断数组是否存满了
		if(size>=length) {
			grow();
		}
//		System.out.println(arrvalue);
		arrvalue[size++]=value;
	}
  • 可以通过下标批量和元素单个查找
  • 判断查找内容的正确性
  • 通过下标查找可以调用通过元素查找
		//查
	//通过元素查找下标
	public int[] searchnote(Object value) {
		
		//判断这个数在数组中是否存在
		int right=0;
		for(int i=0;i<arrvalue.length;i++) {
			if(value==arrvalue[i]) {
				right++;
			}
		}
		if(right==0) {
			System.out.println("数组中此数不存在");
			return null;
		}
		
		//获取符合查找数据的下表并打印出来
		int num=0;
		int j=0;
		
		//记录所查元素个数并以此创建数组存储下标
		for(int i=0;i<arrvalue.length;i++){
			if(arrvalue[i]==value) {
				num++;
			}
		}
		System.out.println("所查找的元素个数:"+num);
		int[] searchlist=new int[num];
		for(int i=0;i<arrvalue.length;i++) {
				if(arrvalue[i]==value) {
				
//				System.out.println("查找元素下标:"+i);
//				System.out.println("给与的下标:"+j);
				searchlist[j]=i;
				j++;
				}
			
		}
		System.out.print("查找数据的下标为:");
		for(int i=0;i<searchlist.length;i++) {
			System.out.print(searchlist[i]+" ");
		}
		System.out.println( );
		return searchlist;
	}
	
	
	//通过下标查找元素
	public Object searchvalue(int note) {
		Object searchvalue = null;
		if(note<size) {
			searchvalue= arrvalue[note];
		System.out.println("查找结果为:"+arrvalue[note]);
		}else {
			System.err.println();
		}
		return searchvalue;
	}
	
  • 删除的后面所有元素都需要向前移动一位
  • 单个删除:通过下标查找后删除,再向前移位
  • 批量删除:通过输入删除元素,找出匹配的再删除;
  • 批量删除也可以调用单个删除的方法
		//删
	//通过下标删除
	public void deletevalue(int note) {
		int oldlength=length;
		int newlength=(oldlength-1);
		Object[] newarrvalue=new Object[newlength];
		
		System.out.println("删除了下标为:"+note+"的,数:"+arrvalue[note]);
		//给删除前面一段的数组赋值
		for(int i=0;i<note;i++) {
			newarrvalue[i]=arrvalue[i];
		}
		//将增加的长度替换为新长度
		length=newlength;
		//将删除后面的数组全部向前移动一位
		for(int i=note;i<(arrvalue.length-1);i++) {
			newarrvalue[i]=arrvalue[i+1];
			
		}
		//将新数组传址
		arrvalue=newarrvalue;
		//清除垃圾
		newarrvalue=null;
		
	}
	//通过元素删除
	public void deletenote(Object value) {
		Object value_right=null;
		
		for(int i=0;i<arrvalue.length;i++) {
			if(arrvalue[i]==value) {
			value_right=value;
			System.out.println("删除了下标为:"+i+"的,数:"+value);
			deletevalue(i);
			//判断相邻的下一个数字是否也为需要删除的数
			if(arrvalue[i]==value_right) {
				i--;
			}
			}
			
		}
	
	}
  • 单个改变:通过下标改变元素
  • 批量修改:通过调用查找方法,用找出的下标来修改元素
		//改
	//根据下标改变元素
	public void change_note(int note,Object value) {
		arrvalue[note]=value;
		System.out.println("将下标为:"+note+"的数,改为"+value);
		
		
	}
	//根据元素改变元素
	public void change_value(Object value,Object value_c) {
		int[] searchlist=searchnote(value);
		for(int i=0;i<searchlist.length;i++) {
			change_note(searchlist[i],value_c);
		}
		
		
		
	}

下期内容–排序

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值