注意:本教程并不能完全做到Vector的功能,该教程仅为了对Vector没有基础的读者理解Vector实现的原理,而实际上的Vector将复杂的多。
一、Vector的简介
Vector(动态数组)是STL中的一个常用容器,与数组一样,采用连续的地址来存储数据。而与数组不同的是vector的大小是可以动态变化的,因此被称为动态数组。然而vector并不像数组是系统自带的,要其原因,就要对STL有一个基本的认知。这里不对STL做出更多解释,总而言之,vector是一个被封装在系统里的由他人定义的类,而操作它的函数(实际上是仿函数)则是定义在这个类中的成员。本文章的目的就是为了读者能够掌握vector的原理,并能通过代码将其实现。
二、vector的原理:
Vector其实是每次添加数据的时候向定义一个新数组,这个数组的长度比旧数组大一,然后将旧数组的数据复制到新数组。
三、vector基础框架的搭建:
public class ArrList {
//初始数组
private Object[] arr ;
private int size = 0; //记录列中数据个数
private static int len = 10; //初始数组默认长度
//构造方法初始化初始数组长度
public ArrList(int len){
arr = new Object[len];
}
public ArrList(){
this(len);
}如此简单的提一串代码就搭建好了vector的框架,但是我们现在还不能对它进行操作,我们接下来就要为其添加多个功能。
四、vector的功能实现:
对于这样一个数据结构,最基础的当然是存入数据与取出数据,此外还有插入,移除,同时还有一些我们想要知道的信息,例如这个动态数组中有多少个元素。
事实上我们可以根据自己的想法为它添加无数的功能,这也是编程的乐趣所在,而事实上,之所以要自己实现这已在Java中封装好的容器就是为了你能在自己需要的时候自己定义函数而不必受制于系统(不过实际上系统自带的vector已经几乎包含了所有会用到的功能),在这篇文章中,我们就只添加最有必要的功能,希望能就此抛砖引玉,让读者能举一反三,将自己的编程思想灵活化。
接下来我们正式开始。
- 存入数据:
public void add(Object data){
dilatation();
//保存数据
arr[size] = data;
size++;
}
//扩容数组
private void dilatation(){
//判断是否需要扩容初始数组
if(size == arr.length){
//扩容
Object[] nArr = new Object[arr.length*2];
//复制数据
for(int i=0;i<arr.length;i++){
nArr[i] = arr[i];
}
arr = nArr;
}
}
- 插入:
可以注意到这里的名称和添加函数一致,为add,为了程序的可读性,我们常常将参数不同而功能相似的函数用同一个函数名表示。
public void add(int index,Object data){
dilatation();
if( index < 0 || index > size){
System.out.println("位置不合法!!!");
}else{
//从index位置开始数据后移一位
//从最后一位置开始移动数据
for(int i=size-1;i>=index;i--){
arr[i+1] = arr[i];
}
//保存数据到index位置
arr[index] = data;
size++;
}
}
- 移除:
//此处我的做法是创建一个新的数组,长度比原数组少一
public void remove(int index)
{
saved_data[] ndsb =new saved_data[dsb.length-1];
for(int i=index+1;i<dsb.length-1;i++){
ndsb[i-1]=dsb[i];
}
dsb=ndsb;
size--;
}
- 获取:
public Object get(int index){
if(index < 0 || index >= size){
System.out.println("下标越界!!!");
return null;
}
return arr[index];
}
- 获取长度:
public int size(){
return size;
}
五、自定义的Vector的使用:
我们提到过,Vector是一个类,想要使用它当然需要定义一个对象。
ArrList list = new ArrList();//此处的ArrList即为我们自己定义的Vector。
list.add("a");
list.add("b");
list.add("c");
list.add(2,"d")//这里用的是插入函数;
for(int i=0;i<list.size();i++){
System.out.print(list.get(i)+" ");
}