文章目录
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。在Java中也有类似这样的顺序表集合类 – ArrayList
接下来将创建MyArrayList对Java顺序表的一些常用方法进行实现。
1.构造方法初始化数组
首先创建MyArrayList类,再在其中定义一个数组存储数据,一个成员变量用来记录有效数据的大小,一个常量用于初始化数组容量。
public class MyArraysList {
public int [] nums;
//记录有效数据
public int usedSize;
private final int DEFAULT_SIZE = 10;
//构造方法创建数组
public MyArraysList() {
this.nums = new int[DEFAULT_SIZE];
}
}
2.实现add方法,新增元素
直接在数组后加入元素
直接把值加进数组即可,这时我们注意到,在增加元素时,很容易产生数组溢出的情况,需要提前判断是否溢出,若溢出要对数组进行扩容再把元素加进数组中。
public void add(int num) {
if(isFull()) {
raise();
}
//注意这里usedSize也要用用this不然不知道是谁的引用的大小
this.nums[this.usedSize] = num;
this.usedSize += 1;
}
//扩容,这里进行两倍扩容
private void raise() {
this.nums =Arrays.copyOf(this.nums,2*this.nums.length);
}
//判断usedSize是否超过使用额度
private boolean isFull() {
return this.usedSize == nums.length;
}
在pos位置加入元素
在指定位置加入元素时,要考虑该位置是否可以加入元素,创建一个新的类自定义一个异常,若该位置不在数组长度范围内则抛出该异常
public class outOfIndex extends Exception{
public outOfIndex(String mis) {
super(mis);
System.out.println(mis);
}
}
//判断位置合法性
private void checkLegal(int pos) throws outOfIndex {
if(pos > this.usedSize || pos < 0) {
throw new outOfIndex("该位置不合法!");
}
}
//在pos位置加入元素
public void add(int pos, int val) {
//处理异常
try {
checkLegal(pos);
}catch (outOfIndex o) {
}
if(isFull()) {
raise();
}
for (int i = this.usedSize; i > pos; i--) {
this.nums[i] = this.nums[i-1];
}
this.nums[pos] = val;
usedSize++;
}
3.打印顺序表
直接遍历数组一遍,需要注意实际数据长度为usedSize,所以只需要遍历到usedSize长度即可。
public void print() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.nums[i] + " ");
}
System.out.println( );
}
4.实现contain方法:判断某元素是否在数组中
遍历数组一遍,查找该元素
public boolean contain(int num) {
//遍历数组查询 时间复杂度O(n)
for (int i = 0; i < this.usedSize; i++) {
if(num == this.nums[i]) {
return true;
}
}
return false;
}
5.实现index方法:查找某个元素第一次出现的位置
遍历数组查找,返回下标,若未包含该元素则返回-1
public int index(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if(toFind == this.nums[i]) {
return i;
}
}
return -1;
}
6. 实现remove方法:删除第一次出现的关键字key
先调用本身的index方法找到要删除的元素的位置,从该位置开始,用后面的值覆盖前面的值,最后usedSize减1,若index返回-1,则顺序表内没有要删除的元素。
public void remove(int key) {
int pos = index(key);
if(pos == -1) {
System.out.println("无该元素!");
return;
}
for(int i = pos; i < this.usedSize; i++) {
this.nums[i] = this.nums[i+1];
}
this.usedSize--;
}
7. 实现size方法:获取顺序表长度
顺序表的长度也就是usedSize的值
public int size() {
return this.usedSize;
}
8.实现clear方法:清空顺序表
直接令usedSize为空即可
public void clear() {
this.usedSize = 0;
}