数组队列是一种大小可以改变,类型没有定死的类似数组的工具。不过与数组相比,它更具有灵活性。因为它不但不用担心越界问题,而且因为泛型(类似c++中模板的东西)的存在而支持各种类型。
以下是数组队列的功能实现代码:
import List.Student;
public class ArrayList <E> {
private Object[] array;
private int size;
private int addNum;
public int getSize()
{
return size;
}
//构造函数一
public ArrayList(int addNum)
{
this.addNum=addNum;
size=0;
array = new Object [addNum];
}
//构造函数二
public ArrayList()
{
/*
* this的三种用法 :
* 1.调用属性 : this.属性名
* 2.调用方法 : this.方法名
* 3.调用构造方法: this.(实参)
*/
//调用构造函数一
this(5);
}
//增加元素
public void add(E elem)
{
//判断是否越界(实现不受长度控制的关键)
if(size==array.length)
{
//越界则创建新数组
Object []temp=new Object[addNum+size];
//复制元素到新数组中
for(int i=0;i<array.length;i++)
{
temp[i]=array[i];
}
//指向新数组名,便可以继续使用array了
array=temp;
}
array[size]=elem;
//修改大小
size++;
}
//删除
public void remove(int index)
{
//判断
if(index>=0&&index<size){
//修改大小
size--;
//index后面的元素向前移动一位
for(int i=index;i<size;i++)
{
array[i]=array[i+1];
}
}
}
//修改
public void change(int index,E elem)
{
//判断
if(index>=0&&index<size)
array[index]=elem; //把值给要改变的位置的元素
}
//查找
public void find(E elem)
{
//记录下标位置
int index=0;
//判断有无此元素的标志
int flag=0;
//遍历寻找
for(int i=0;i<size;i++)
{
if(array[i].equals(elem))
{
//找到就输出
System.out.println("index="+index);
//记录标志
flag=1;
}
index++;
}
//判断有无
if(flag==0)
System.out.println("无此元素");
}
//插入
public void insert(int index,E elem)
{
//判断
if(index>=0&&index<size){
//判断是否越界
if(size==array.length)
{
//越界则创建新数组
Object []temp=new Object[addNum+size];
//遍历复制元素
for(int i=0;i<array.length;i++)
{
temp[i]=array[i];
}
//指向新数组
array=temp;
}
//修改大小
size++;
//index 后面的元素都向后移动一位
for(int i=size-2;i>=index;i--)
{
array[i+1]=array[i];
}
//index位置的值为插入的值
array[index]=elem;
}
}
//输出
public void showInfo()
{
for(int i=0;i<size;i++)
{
System.out.print(array[i]+" ");
}
System.out.println();
}
//递归法输出
public void showInfo2(int size)
{
//终止条件
if(size==1)
{
System.out.print(array[this.size-size]+" ");
}
else
{
System.out.print(array[this.size-size]+" ");
showInfo2(size-1);
}
}
public void showInfo2()
{
showInfo2(this.size);
System.out.println();
}
public static void main(String [] args)
{
ArrayList <Student> list = new ArrayList<Student>();
for(int i=0;i<10;i++)
{
list.add(new Student("学生"+(i)));
}
// System.out.println("size="+list.getSize());
// list.showInfo2();
// list.remove(0);
// System.out.println("size="+list.getSize());
// list.showInfo();
// list.change(5, new Student("qinglong"));
// System.out.println(list.getSize());
// list.showInfo();
// list.find(new Student("学生0"));
// list.insert(0, new Student("qwerty"));
// System.out.println(list.getSize());
list.showInfo();
}
}
学生类如下:
public class Student {
private String name;
//构造函数
public Student(String name)
{
this.name=name;
}
//重写toString方法
public String toString()
{
return name;
}
//重写eqauls方法
public boolean eqauls(Student stu)
{
return name.equals(stu.name);
}
}
其中 调用构造方法: this.(实参) 也是第一次碰到。
我的这个数组对列虽然实现了,但有个缺陷,就是我所有的方法都是void类型。这样当我要用到某些东西的时候,可能就不行了。所以其中一些方法应该return一些东西。