数组与数组队列
一、数组:
数组是有序的在定义时已经设定好大小,能存储多种数据类型,根据用途还可以分为n维数组。以下是数组的定义方式:
一维数组
1、数组类型[]数组名=new 数据类型[长度];
2、数据类型 [] 数组名 = {值,...};
3、数据类型 [] 数组名 = new 数据类型[]{值,...};
4、数据类型 [] 数组名;
数组名 = new 数据类型[长度];
5、数组名 = new 数据类型[]{值,...};
二维数组
1、数据类型 [][] 数组名 = new 数据类型[行][列];
2、数据类型 [][] 数组名 = {{值,...},...};
3、数据类型 [][] 数组名 = new 数据类型[][]{{值,...},...};
4、数据类型 [][] 数组名;
数组名 = new 数据类型[行][列];
5、数组名 = new 数据类型[][]{{值,...},...};
数组的使用必须先给对象(实例化),再使用:
Array[0]=new Object();
Object obj=Array[0];
obj.方法名(参数);
数组的使用涉及到了数组越界的问题,那么如何来获得数组的界限呢?
1、获取一维数组的元素总数:数组名.length;
2、获取二维数组的行的列数:数组名[r].length;(所谓二维数组,其实是一维数组的一维数组,所以可以认为 数组名[][] 为数组名为数组名[]的一维数组 );
3、获取二维数组的行数:数组名.length;
而获取指定位置的数据:数组名[下标];
数组名[行下标][列下标];(二维数组中的位置抽象为行与列的存在)。
二、数组的优点与缺点
优点:数组在使用时可以说是很方便了,每一个数据都有他的下标,所以需要用到指定位置的数据时只需要,给定下标就好,寻找方便;
缺点:大小是固定,不能根据数据总数的变化进行更改大小。
三、数组队列:
数组队列的主要作用是优化数组,对其缺点进行覆盖。首先需要想到数组名中存储的是什么?是在堆空间中的内存首地址。所以我们可以创建一个数组队列类,在其中定义一个初始大小为0的数组;在其中添加数据、删除数据、查找数据、修改数据的方法。
四、数组队列的代码实现:
1、代码如下:
public class Arrayqueue { //原数组 private Object[] obj_1=new Object[0]; private int size;//存储数组的大小 //添加数据 public void add(Object date){ //新建一个数组 是原数组长度+1 //数组必须先给对象才能用 Object[] obj_2=new Object[obj_1.length+1]; //将原数组的数据移进新数组 for(int i=0;i<obj_1.length;i++){ obj_2[i]=obj_1[i]; } //将要加入的数据加到最后一位 obj_2[obj_1.length]=date; //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size++; } //根据索引删除 public void delete(int index){ if(index < 0 || index >= size){ throw new RuntimeException("索引越界!"); }else { //新建一个数组 是原数组长度+1 Object[] obj_2=new Object[obj_1.length-1]; for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组 obj_2[i]=obj_1[i]; } for(int j=index;j<obj_2.length;j++){//将所要删除的位置之后的所有数据赋予新数组 obj_2[j]=obj_1[j+1]; } //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size--; } } //根据索引查找 public Object find(int index){ if(index < 0 || index>= size){ throw new RuntimeException("索引越界!"); }else{ return obj_1[index];//返回查找的数据 } } //修改 public Object redo(int index,Object date){ if(index < 0 || index>= size){ throw new RuntimeException("索引越界!"); }else{ obj_1[index]=date; return obj_1[index];//返回修改的数据 } } public int size(){ return size;//返回数组的大小 } }
2、写一个测试类对其进行测试:
public class Test_1 { // 程序入口 public static void main(String[] args) { //实例化Arrayqueue的对象 Arrayqueue aq=new Arrayqueue(); for(int i=0;i<8;i++){ Object obj1=new Object("张三"+i,i); aq.add(obj1); } //修改数据 Object date=new Object("李四 ",100); aq.redo(0, date); //删除 aq.delete(3); //添加数据(加到最后一位) Object date_1=new Object("王五 ",300); aq.add(date_1); Print(aq);//打印数据 } //打印数据的方法 public static void Print(Arrayqueue aq){ for(int t=0;t<aq.size();t++){ Object obj= (Object) aq.find(t); obj.Show(); } } }
3、简单的Object类:
public class Object { private String name; private int grade; public Object(String name,int grade){ this.name=name; this.grade=grade; } public void Show(){ System.out.println("name: "+name+" "+"grade: "+grade); } }
五、结
数组队列的实现还是遇到了不少的坎的,但是在真正理解了以后每一句代码又是那么的明了。以下浅谈我遇到的问题
1、空指针异常:
【Exception in thread "main" java.lang.NullPointerException
at com.czj1109.Test_1.Print(Test_1.java:33)
at com.czj1109.Test_1.main(Test_1.java:26)
name: 李四 grade: 100
name: 张三1 grade: 1
name: 张三2 grade: 2】编译结果
********引起错误的代码********
//根据索引删除的方法 public void delete(int index){ if(index < 0 || index >= size){ throw new RuntimeException("索引越界!"); }else { //新建一个数组 是原数组长度+1 Object[] obj_2=new Object[obj_1.length-1]; for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组 obj_2[i]=obj_1[i]; } for(int j=index+1;j<obj_1.length-1;j++){//将所要删除的位置之后的所有数据赋予新数组 obj_2[j]=obj_1[j+1]; } //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size--; } }
********修改错误之后的代码********
//根据索引删除的方法 public void delete(int index){ if(index < 0 || index >= size){ throw new RuntimeException("索引越界!"); }else { //新建一个数组 是原数组长度+1 Object[] obj_2=new Object[obj_1.length-1]; for(int i=0;i<index;i++){//将所要删除的位置之前的所有数据赋予新数组 obj_2[i]=obj_1[i]; } for(int j=index;j<obj_2.length;j++){//将所要删除的位置之后的所有数据赋予新数组 obj_2[j]=obj_1[j+1]; } //交换(删除原数组)原数组指向新数组 obj_1=obj_2; size--; } }
2、有待完善的地方
//根据内容删除(需重写equals方法)
public void delete(Object date){
}
这一方法还没能够实现。
以上便是我在实现数组队列时的优化分析、思路、以及遇到的问题。
2014 11 15
梣梓
相关推荐
NULL 博文链接:https://128kj.iteye.com/blog/1665616
java数组实现循环队列。包括入队, 出队,输出队列。 队列先入先出。
c++ 队列数组实现,这个简单的东西。队列的数组实现
普通队列 1)将尾指针往后移:rear+1,当front==rear【空】 2)若尾指针rear小于队列的最大下标maxSize-1,则将数据存入rear所指的数中组元素中,否则无法存入数据。rear==maxSize-1[队列满] 环形队列 1)front变量的...
队列关于数组与链表的实现, linux c语言
队列是一种先入先出的数据结构(FIFO),只允许在前端(front)删除,在后端(rear)插入。容量为capacity大小的内存,只能存capacity-1的元素,其中rear的位置始终为空。 本文实现的队列,功能如下: 1 获取元素内容 ...
队列的数组实现,用C++写的,适合初学者。
由数组实现队列,包括队列的创建、入队和出队。通过打印显示出队的结果。正在学习数据结构的童鞋可以参考。
学习数据结构过程中,亲自在VC++上编译通过的使用数组实现队列的源代码,与大家共享。
循环链表队列的代码实现 循环数组队列的代码实现
更好了解数组和队列在C++应用开发当中使用,明白C++的变量内存结构。
配套代码讲解:https://blog.csdn.net/songchuwang1868/article/details/90200251 ...同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列 同步队列-无锁队列-循环数组无锁队列
go语言通过数组和链表的方式实现队列 数组和链表.pdf
python利用数组和链表实现栈和队列 数组和链表.pdf
利用数组和链表实现队列的基本操作,如入队,出队,读出队首元素
栈队列串数组
数组循环队列
NULL 博文链接:https://shxin.iteye.com/blog/1948849
本文代码测试结果均基于node v6.9.5 数组与队列 利用数组对象方法push/shift可实现队列先进先出特性,例如: >a=[] [] >a.push(2.3.4) 3 >a.push(2) 3 >a [2.3.4.2] >a.shift() 2 >a >[3.4.2] 数组...