一、什么是顺序表
概念:顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
如下图:
优点:访问速度比较快,在给定下标的情况下时间复杂度低至O(1)
因此,顺序表适用于经常进行 下标查找 或者 更新 的操作
那么下面我们就来试着自己实现一个顺序表MyArrayList,并实现基础的增删查改的操作吧
二、MyArrayList的实现
1、定义MyList接口
public interface MyList {
// 新增元素,默认在数组最后新增
void add(int data);
// 在 pos 位置新增元素
void add(int pos, int data);
// 判定是否包含某个元素
boolean contains(int toFind);
// 查找某个元素对应的位置
int indexOf(int toFind);
// 获取 pos 位置的元素
int get(int pos);
// 给 pos 位置的元素设为 value -> 更新
void set(int pos, int value);
//删除第一次出现的关键字key
void remove(int toRemove);
// 获取顺序表长度
int size();
// 清空顺序表
void clear();
// 打印顺序表,
void display();
boolean isFull();
}
2、MyArrayList实现接口
1、定义成员变量与构造方法
public int[] elem;
public int usedSize;
public MyArrayList() {
this.elem = new int[10];
}
2、添加元素add
(1)尾部添加元素
public void add(int data) {
//判断是否满了,如果满了就扩容
if(isFull()) {
//扩容
elem = Arrays.copyOf(elem,2*elem.length);
}
this.elem[usedSize] = data;
this.usedSize++;
}
(2)指定下标添加元素
public void add(int pos, int data) {
try {
checkPosOfAdd(pos);
}catch (PosNotLegalException e) {
e.printStackTrace();
}
if(isFull()) {
elem = Arrays.copyOf(elem,2*elem.length);
}
//移动元素
for (int i = usedSize-1; i >= pos; i--) {
elem[i+1] = elem[i];
}
//插入元素
elem[pos] = data;
usedSize++;
}
/*
该方法来 判断 添加元素时 pos是否合法
*/
private void checkPosOfAdd(int pos) throws PosNotLegalException{
if(pos < 0 || pos > usedSize) {
throw new PosNotLegalException("pos位置不合法!");
}
}
3、判断是否包含某个元素
public boolean contains(int toFind) {
//只需要寻找usedSize次
for (int i = 0; i < usedSize; i++) {
if(elem[i] == toFind) {
return true;
}
}
return false;
}
4、查找某个元素对应的位置
public int indexOf(int toFind) {
for (int i = 0; i < usedSize; i++) {