什么是数组队列?
数组队列是利用数组这种数据结构来处理实现多个数据的类,增加了数组的灵活性。(在程序中数组的灵活性不够,因为定义的长度是死的。如果定义长了浪费内存,短了不够用)
数组队列的实现
1.定义接口,定义需要的抽象方法
a.增加元素的方法;在固定的位置 ,添加元素的方法;
b.删除该数组中一个元素的方法(根据元素进行删除)
c.删除一个位置上面的数据的方法(根据下标进行删除操作);
......
总的来说,增删改等方法都是根据自己所需要的去定义
2.为了让数组队列可以存储多种类型的数,改变数组只能存储一种数据的情况:使用泛型
为什么使用泛型?
泛型不是基本数据类型也不是引用数据类型,只是一种特殊符号,可以用来泛指java中的任何一种类型。如果定义数组时用了某一类,那数组只能存储一种数组。而定义数组之前并不知道将要存储什么数据类型,为了实现多种类型存储,使用泛型。
public interface MyAbstactArray<E> {
public void add(E e);//向队列末尾添加一个元素
public boolean add(int location,E e);//向队列指定位置添加元素,返回true表示插入成功,false表示插入失败
public E get(int location);//获取指定位置元素
public boolean remove(E e);//删除指定的元素,返回true表示成功,false失败
public E remove(int location);//删除指定位置的元素,返回null表示成功,否则失败
public boolean update(int location,E e);//更新指定位置的元素,返回true成功,false失败
public boolean update(E old,E e);//用一个新的元素更新旧的指定元素
public boolean removeall();//移除所有
public int size();//获取数组队列中存储的元素总数
}
3.定义一个数组队列类实现接口,重写接口中的方法(其实可以直接不用定义接口实现它,简单点的话可以直接在数组队列类中定义方法,不需要重写接口中的方法)
为什么使用Object定义数组?
Object是所有类得到父类。虽然基本数据类型没有继承Object类,但是基本数据类型对应有一个封装类。因此基本可以说Object也算是基本数据类型的父类。如果设置为Object类型的数组,就可以存储不同类型的数据。
public class MyArray<E> implements MyAbstactArray<E> {
// 记录数组初始长度
private int length = 1;
// 声明记录数组队列中存储的元素个数
private int size = 0;
// 声明一个数组变量
Object[] Array;
public MyArray(int length) {
this.length = length;
Array = new Object[length];
}
@Override
public void add(E e) {
if (size < length) {
Array[size] = e;
size++;
} else {
Object[] newArray = new Object[2 * length];
for (int i = 0; i < Array.length; i++) {
newArray[i] = Array[i];
}
newArray[size] = e;
Array = newArray;
length = newArray.length;
size++;
}
}
@Override
public boolean add(int location, E e) {
if (location < 0 || location >= size) {
System.out.println("超过size时使用该方法无法添加");
return false;
} else {
Object[] newArray = new Object[size + 1];
newArray[location] = e;
for (int i = 0; i < location; i++) {
newArray[i] = Array[i];
}
for (int i = location; i < size; i++) {
newArray[i + 1] = Array[i];
}
Array = newArray;
length = newArray.length;
size++;
return true;
}
}
@SuppressWarnings("unchecked")
@Override
public E get(int location) {
if (location < 0 || location >= size)
return null;
else
return (E) Array[location];
}
@Override
public boolean remove(E e) {
for(int i = 0;i<size;i++) {
if(Array[i] == e) {
Array[i] = null;
for(int j = i;j < size;j++) {
Array[j] = Array[j+1];
}
size--;
}
}
return true;
}
@Override
public E remove(int location) {
for (int i = 0; i < size; i++) {
if (i == location) {
Array[i] = null;
for (int j = i; j < size - 1; j++) {
Array[j] = Array[j + 1];
}
}
}
size--;
return null;
}
@Override
public boolean removeall() {
Object[] newArray = new Object[0];
Array = newArray;
if (Array.length == 0)
return true;
else
return false;
}
@Override
public int size() {
return size;
}
@Override
public boolean update(int location, E e) {
if (location < 0 || location >= size)
Array[location] = e;
return true;
}
@Override
public boolean update(E old, E e) {
for(int i = 0;i<size;i++) {
if(Array[i] == old)
Array[i] = e;
}
return true;
}
}
注:java中有自带的队列ArrayList可以使用