1.什么是顺序表
顺序表:是线性表的存储结构,指在一组地址连续的存储单元中依次的存储每个元素,使逻辑相邻的元素存储在物理相邻的存储单元的线性表中。
2.顺序表的实现
(1)创建一个MyArrayList类
public class MyArrayList {
private long[] array;
private int size;
public MyArrayList() {
array = new long[2];
size = 0;
Arrays.fill(array, Long.MIN_VALUE);
}
}
(2)获取数组长度
public int size() {
return size;
}
(3)检查对象的正确性
public void check() {
if (array == null) {
throw new RuntimeException();
}
if (array.length == 0) {
throw new RuntimeException();
}
if (size < 0) {
throw new RuntimeException();
}
if (size > array.length) {
throw new RuntimeException();
}
for (int i = 0; i < size; i++) {
if (array[i] == Long.MIN_VALUE) {
throw new RuntimeException();
}
}
for (int i = size; i < array.length; i++) {
if (array[i] != Long.MIN_VALUE) {
throw new RuntimeException();
}
}
}
(3)定义add方法用来插入元素
尾插操作(pushBack)
public void add(long e) {
enSureCapacity();
array[size] = e;
size++;
}
在指定位置进行插入
public void add(int index, long e) {
if (index < 0 || index >= size) {
throw new ArrayIndexOutOfBoundsException("输入下标不符合[0,size) index:" + index);
}
enSureCapacity();
for (int i = size - 1; i >= index; i--) {
int j = i + 1;
array[j] = array[i];
}
array[index] = e;
size++;
}
enSureCapacity方法 判断是否需要扩容
private void enSureCapacity() {
if (size < array.length) {
return;
}
int newLength = array.length * 2;
long[] newArray = Arrays.copyOf(array, newLength);
Arrays.fill(newArray, size, newLength, Long.MIN_VALUE);
array = newArray;
}
(4)定义delete方法用来删除元素
传入下标进行删除
public void delete(int index) {
if (index < 0 || index > size) {
throw new ArrayIndexOutOfBoundsException("输入下标不符合[0,size] index:" + index);
}
for (int i = index; i < size - 1; i++) {
int j = i + 1;
array[i] = array[j];
}
array[size - 1] = Long.MIN_VALUE;
size--;
}
传入值删除与值相同的元素
public void delete(long e) {
boolean flag = false;
for (int i = 0; i < size; i++) {
if (array[i] == e) {
flag = true;
break;
}
}
if (flag) {
int j = 0;
for (int i = 0; i < size; i++) {
if (array[i] != e) {
array[j] = array[i];
j++;
}
}
size = j;
Arrays.fill(array, size, array.length, Long.MIN_VALUE);
} else {
throw new RuntimeException("表中没有该元素无法进行删除 element:" + e);
}
}
思想:将在 i 位置上元素的移动到 j 位置的元素上 1.如果还没有碰到要删除的元素就进行元素移动 2.如果碰到了要删除的元素就跳过该元素 3.重复 1 和 2 的操作 最后 j 的大小就是元素的个数
以上就是顺序表中一些基本的操作,例如:遍历、元素添加、元素删除、获取数组长度、检查对象正确性。 如有错误,欢迎指正!
|