数组队列的学习(一)–数组中的增删查改
数组和队列的认识
数组
基本属性和方法
- 属性: 元素个数,长度
- 方法:Object类的方法
- 使用难度和隐患:使用起来十分简单,所以相对的其安全性比较差;
创建和使用:
int[] onelist;
onelist=new int[999];
onelist[21]=100;
数组中常见报错
- 越界:从外向内操作 取用超出下标之外的内容
- 溢出:内部内存不够了--栈、堆
队列
- 各种管理数组的方法:排序、增删查改、自动扩容、合并
数组的增删查改
- 我们需要一个数组 MyList,以及一个接口List存有增删查改的方法
- 接口的方法:增 删 查 改
- MyList的属性:存储结构、Size元素数、 Length长度
- MyList的初始化:根据传进的内容来初始化—长度、数组、链表、空参数
- 注意:增删查改等方法自己编写时需要堤防传入数据的正确性!
数组的增删查改方法的编写
数组初始化
设置数组基本属性
public MyList{
int length;
int size;
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;
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();
}
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) {
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);
}
}
下期内容–排序