顺序表 —— Java附加代码
每博一文案
看到过这样一句话,如果一个人频繁出现在你的梦里,是你的身体感觉到
了你的思念,替你见了一面你朝思暮想的人,而那些出现在梦里的人,大多是再也没见过的人
也许是在某一天告别,也可能连告别都没有。
就散落在天涯,从此天各一方,无论有多么不舍,已经在梦中见过一次.
这是上天在满足你的愿望,提醒你该放下了,谁也不是谁的贵人,都是对方的一个过客
人与人之间的缘分早已注定
而后的许多事,无论如何都无法改变,就像有些人相遇相知,相识恨晚
,但早晚有一天都要分别有人遗憾终身,也有人一笑了之,不是后者
有多薄情,而是他明白。
遇到了就应珍惜,离开了就要放下。
———————— 一禅心灵庙语
文章目录
- 首先对于顺序表的详细的介绍大家可以参考🔜🔜🔜 图 + 码 = 顺序表 —— C语言实现(附有源码实现)
- 我们直接上操作
创建项目的注意事项
- 首先我们要明白一点就是不存在没有完完全全BUG的项目,就像人无完人一样 我们只能不断地对项目进行优化,减少BUG 的出现,但是我们好像并不能完全的消除所有的BUG
- 而消除bug 的最好的方式就是运行测试+调试
- 而我们在运行测试+调试 的时候,需要我们控制一定的量 ,我们需要把握住这个量 ,这一点是十分重要的,这样有助于我们快速的发现问题,也就是bug 的所在,从而提高我们的效率,减少我们的bug 的出现
- 具体的方法,我个人有以下建议:
- 首先我们需要对项目进行合理的分类,那个类,那个文件实现什么样的功能: 比如:一个类是用于定义什么类型,方法的 ,另一个类是用于什么头main 的,再另外一个类是用于对于什么功能上的实现的 ,合理的分类,可以提高我们项目的可读性,让我们自身不会因为自己随着代码量的增加,对应功能上的增加而导致我们越敲越乱,越写越蒙
- 对于量上我们可以,每实现了两三个 功能就运行测试看看,是否存在错误,如果存在出现了错误,我们可以在一定的量(范围内),快速的找出哪里出现了问题,从而对它进行调试 ,解决问题,而不是,把项目整体写完了或者是已经实现了好几十个功能,才开始运行测试项目,结果一运行,bug,警告 冒出一大坨,我们先不说,让不让人,抓头发,就是找出问题,恐怕都需要不时间上的浪费吧
- 对于代码上的注释,没事多写明白一点,或许有一天,你会感想曾经,那个写了注释的自己或同事
- 对于bug 不要害怕,一点一点的调试看看,找出问题的所在,慢慢来,要有耐心,要明白一点现在bug 写的多,以后bug 跟你说拜拜,现在bug ,不解决,bug 天天对你说**“明天见”**
顺序表的实现
- 顺序表其实就是一种数组,存放连续的数据信息的,稍微有些不同的就是顺序表,
- 附加了可以实现简单的扩容,从而增加了数据的存储的容量
- 所以我们可以通过创建数组,实现所谓的顺序表
顺序表的定义
- 对于属性我们一般尽量私有化
- 常量我们尽量被static final 关键字修饰
public class MyArrayList {
private int[] elem; // 定义数组
private int usedSize; // 有效数据个数
private static final int intCapacity = 10; // 定义常量数组的初始大小
}
顺序表的初始化
// 顺序表的初始化,这里通过构造方法,初始化
public MyArrayList() {
this.usedSize = 0;
this.elem = new int[10];
}
顺序表的打印
- 这个简单对就是对数组循环遍历一波即可
// 打印顺序表
public void disPlay() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem[i]+",");
}
System.out.println();
// System.out.println(Arrays.toString(this.elem));
}
顺序表的尾插
- 首先我们在插入数据之前需要判断一下,顺序表是否满了
- 如果满了,我们就需要扩容上的实现,扩容成功才插入数据
- 这里的扩容我们通过方法 Arrays.copyOf 拷贝实现扩容:
- 在扩容上我们不能太小,也不能太大了,如果我们太小了,就会存在,我们插入数据时,不停的需要扩容,扩容会影响一定的效率的,就是会存在一定的性能上的损耗,而如果我们扩容太大了,就会导致我们出现大量的空间上的浪费,所以我们需要适当的扩容,一般为原来顺序表的1.5倍或者是2倍
- 插入数据,数据的有效个数++
顺序表是否满的实现
- 判断顺序表的长度是否等于该存放对应数据的个数,等于表示满了,返回 ture ,不等于表示没有满,返回 false
// 判断顺序表是否满了
private boolean isFull() {
return this.elem.length == this.usedSize;
}
尾插
// 插入数据,尾插
public void tailAdd(int data) {
if(this.isFull()) {
// 顺序表满了,通过拷贝赋值,扩容2倍
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
// 插入数据
this.elem[this.usedSize] = data;
this.usedSize++;
}
pos位置插入数据
- 首先我们需要对 pos 该插入的位置是否合理进行判断:不可以小于 0 ,不可以超出顺序表的范围,
- 同样我们对插入的数据时,需要判断顺序表是否满了,满了扩容,扩容成功,才插入数据
- 我们需要对原先在该位置的数据进行移动,防止被覆盖
- 插入数据,数据的有效个数++
// pos位置插入数据
public void add(int pos ,int data) {
// 1.判断是否需要扩容
if(this.isFull()){
// 扩容
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
// 2.判断pos 的位置是否合理
if(pos < 0 || pos > this.usedSize) {
return;
}
// 3.移动数据位置
for(int i = this.usedSize-1;i>= pos;i--) {
this.elem[i+1] = this.elem[i];
}
// 4.插入数据
this.elem[pos] = data;
this.usedSize++;
}
顺序表中查找是否含有该数值
- 遍历顺序表,查找,存在该数值,返回 true ,不存在该数值,返回 false
// 查找该顺序表中是否含有该数值
public boolean contains(int toFind) {
for (int tmp:this.elem) {
if(toFind == tmp) {
return true; // 该数值存在
}
}
return false; // 该数值不存在
}
查找该数值在顺序表中的位置
- 遍历该顺序表,找到返回该数值所在的下标位置,找不到返回 -1,顺序表中不存在,-1 的下标表示,没有找到(该数值不存在)
// 查找该数值在顺表中的位置
public int search(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if(toFind == this.elem[i]) {
return i; // 找到返回下标
}
}
return -1; // 没有找到
}
取出顺序表中某个下标位置的数值
- 首先我们需要判断该顺序表是否为空,如果为空的话,不用找了,自定义异常停止执行
- 判断给定的下标是否合理
- 通过下标访问,取出对应下标的值
// 取出顺序表中某个下标位置的数值
public int getPos(int pos) {
// 1. 判断该顺序表是否为空
if(this.usedSize == 0) {
throw new RuntimeException("顺序表是空的!");// 自定义异常停止执行
}
// 2. 判断该pos 位置是否合理
if(pos <0 || pos >= this.usedSize) {
throw new RuntimeException("pos位置不合法");
} else {
return this.elem[pos]; // 返回对应下标的数值
}
}
删除顺序表中的某个数值
- 首先我们需要判断该顺序表是否为空,如果为空的话,不用找了,自定义异常停止执行
- 需要获得该数值的下标,我们可以复用 前面我们实现 :查找该数值在顺序表中的位置 ,来找到该数值的位置
- 挪动位置,对需要删除的数据进行覆盖,
- 删除(覆盖)成功,有效数据个数–(减减)
// 删除顺序表中的某个数值
public void remove(int toRemove) {
// 1. 判断该顺序表是否为空
if(this.usedSize == 0) {
throw new RuntimeException("顺序表是空的!");// 自定义异常停止执行
}
//2. 判断该数值是否存在
int index = this.search(toRemove);
if(index == -1) {
System.out.println("该数值不存在,无法删除");
return;
}
// 3.移动数据,实现覆盖删除
for(int i = index;i<this.usedSize-1;i++) {
this.elem[i] = this.elem[i+1];
}
this.usedSize--;
}
删除某下标 pos 的数值
- 和上面删除顺序表中的某个数值是,一样的
- 判断该顺序表是否为空,为空就不用删了,自定义异常停止执行
- 判断该pos 下标的位置是否合理
- 挪动顺序表中的数值,覆盖需要删除的数值,从而达到删除的效果
- 删除成功,数据的有效个数 --(减减)
// 删除某下标 pos 的数值
public void Delete(int pos) {
// 1. 判断该顺序表是否为空
if(this.usedSize == 0) {
throw new RuntimeException("顺序表是空的!");// 自定义异常停止执行
}
// 2. 判断该下标是否合理
if(pos < 0 || pos >= this.usedSize) {
System.out.println("该下标不合理");
return;
} else {
//3. 下标合理,覆盖实现删除
for (int i = pos; i < this.usedSize-1; i++) {
this.elem[i] = this.elem[i+1];
}
this.usedSize--;
}
}
更新数值
- 更新数值,在所在下标,更新数值
- 判断该下标,是否合理,
- 通过下标赋值,更新数值
// 更新数值,在所在下标,更新数值
public void setPos(int pos,int value) {
// 判断该下标是否合理
if(pos < 0 || pos >= this.usedSize) {
throw new RuntimeException("pos 位置不合法");
}
// 合理更新
this.elem[pos] = value;
}
清除顺序表
- Java有自动回收功能,所以我们只需要把,记录的有效数据置为 0 即可
// 清除顺序表
public void clear() {
// 直接将顺序表中的有效数据记录置为 0 ; 即可
this.usedSize = 0;
System.out.println("清空成功");
}
}
顺序表中有关 maIn 的类
public class MyArrayListTest {
public static void main(String[] args) {
MyArrayList myList = new MyArrayList(); // 实例化顺序表对象
for (int i = 1; i <10 ; i++) {
myList.tailAdd(i); // 头插入数据
}
myList.disPlay(); // 打印顺序表
myList.tailAdd(10); // 头插入数值 10
myList.disPlay(); // 打印顺序表
myList.add(3,11); // 在 pos 位置插入数值
myList.add(11,11); // 在 pos 位置插入数值
myList.disPlay(); // 打印数值
System.out.println(myList.contains(9)); // 查找该顺序表中是否含有该数值
System.out.println(myList.contains(99)); // 查找该顺序表中是否含有该数值
System.out.println(myList.search(4)); // 查找该数值在顺表中的位置
System.out.println(myList.search(99)); // 查找该数值在顺表中的位置
System.out.println(myList.getPos(3)); // 取出顺序表中某个下标位置的数值
// System.out.println(myList.getPos(20)); // 取出顺序表中某个下标位置的数值
myList.remove(4); // 删除顺序表中的某个数值
myList.disPlay(); // 打印顺序表
// myList.remove(0);
System.out.println("*********************");
myList.Delete(0); // 删除某下标 pos 的数值
myList.disPlay(); // 打印顺序表
myList.Delete(2); // 删除某下标 pos 的数值
myList.disPlay();
myList.setPos(0,100); // 更新数值,在所在下标,更新数值
myList.setPos(8,999); // 更新数值,在所在下标,更新数值
myList.disPlay();
myList.clear(); // 清除顺序表
myList.disPlay();
}
}
完整的顺序表的代码
import java.util.Arrays;
public class MyArrayList {
private int[] elem; // 定义数组
private int usedSize; // 有效数据个数
private static final int intCapacity = 10; // 定义常量数组的初始大小
// 顺序表的初始化,这里通过构造方法,初始化
public MyArrayList() {
this.usedSize = 0;
this.elem = new int[10];
}
// 打印顺序表
public void disPlay() {
for (int i = 0; i < this.usedSize; i++) {
System.out.print(this.elem[i]+",");
}
System.out.println();
// System.out.println(Arrays.toString(this.elem));
}
// 判断顺序表是否满了
private boolean isFull() {
return this.elem.length == this.usedSize;
}
// 插入数据,尾插
public void tailAdd(int data) {
if(this.isFull()) {
// 顺序表满了,通过拷贝赋值,扩容2倍
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
// 插入数据
this.elem[this.usedSize] = data;
this.usedSize++;
}
// pos位置插入数据
public void add(int pos ,int data) {
// 1.判断是否需要扩容
if(this.isFull()){
// 扩容
this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
}
// 2.判断pos 的位置是否合理
if(pos < 0 || pos > this.usedSize) {
return;
}
// 3.移动数据位置
for(int i = this.usedSize-1;i>= pos;i--) {
this.elem[i+1] = this.elem[i];
}
// 4.插入数据
this.elem[pos] = data;
this.usedSize++;
}
// 查找该顺序表中是否含有该数值
public boolean contains(int toFind) {
for (int tmp:this.elem) {
if(toFind == tmp) {
return true; // 该数值存在
}
}
return false; // 该数值不存在
}
// 查找该数值在顺表中的位置
public int search(int toFind) {
for (int i = 0; i < this.usedSize; i++) {
if(toFind == this.elem[i]) {
return i; // 找到返回下标
}
}
return -1; // 没有找到
}
// 取出顺序表中某个下标位置的数值
public int getPos(int pos) {
// 1. 判断该顺序表是否为空
if(this.usedSize == 0) {
throw new RuntimeException("顺序表是空的!");// 自定义异常停止执行
}
// 2. 判断该pos 位置是否合理
if(pos <0 || pos >= this.usedSize) {
throw new RuntimeException("pos位置不合法");
} else {
return this.elem[pos]; // 返回对应下标的数值
}
}
// 删除顺序表中的某个数值
public void remove(int toRemove) {
// 1. 判断该顺序表是否为空
if(this.usedSize == 0) {
throw new RuntimeException("顺序表是空的!");// 自定义异常停止执行
}
//2. 判断该数值是否存在
int index = this.search(toRemove);
if(index == -1) {
System.out.println("该数值不存在,无法删除");
return;
}
// 3.移动数据,实现覆盖删除
for(int i = index;i<this.usedSize-1;i++) {
this.elem[i] = this.elem[i+1];
}
this.usedSize--;
}
// 删除某下标 pos 的数值
public void Delete(int pos) {
// 1. 判断该顺序表是否为空
if(this.usedSize == 0) {
throw new RuntimeException("顺序表是空的!");// 自定义异常停止执行
}
// 2. 判断该下标是否合理
if(pos < 0 || pos >= this.usedSize) {
System.out.println("该下标不合理");
return;
} else {
//3. 下标合理,覆盖实现删除
for (int i = pos; i < this.usedSize-1; i++) {
this.elem[i] = this.elem[i+1];
}
this.usedSize--;
}
}
// 更新数值,在所在下标,更新数值
public void setPos(int pos,int value) {
// 判断该下标是否合理
if(pos < 0 || pos >= this.usedSize) {
throw new RuntimeException("pos 位置不合法");
}
// 合理更新
this.elem[pos] = value;
}
// 清除顺序表
public void clear() {
// 直接将顺序表中的有效数据记录置为 0 ; 即可
this.usedSize = 0;
System.out.println("清空成功");
}
}
最后:
限于自身水平,其中存在的错误希望大家,给予指教,韩信点兵——多多益善,谢谢大家!后会有期,江湖再见 !