当前位置: 首页 > news >正文

Java顺序表的实现

目录

1.初始化数组

2.顺序表的打印

3.获取顺序表的长度

4.默认在数组最后位置新增的add方法

5.在指定位置新增的add方法

6.判断是否包含某个元素

7.查找某个元素对应的位置

8.获取pos位置的元素

9.将pos位置的元素更新成value

10.删除第一次出现的关键字key

11.清空顺序表


顺序表本质上就是一个数组,而顺序表就是实现对这个数组进行增删查改等操作方法的一个类,而Java中也有类似与顺序表的集合类:ArrayList<E> 下面我会对这个类里面比较重要且常用的方法进行实现。

1.初始化数组

我们首先创建一个我们自己的类MyArrayList,在里面定义一个int类型的数组,usedSize记录数组里面的元素个数,DEFAULT_SIZE 是建立数组的默认容量,通过构造方法对数组进行初始化容量

public class MyArraylist {

    public int[] elem;
    public int usedSize;
    private static final int DEFAULT_SIZE = 10;//默认容量

    public MyArraylist() {
        this.elem = new int[DEFAULT_SIZE];
    }
}

2.顺序表的打印

遍历整个顺序表,用前面定义的 usedSize 判断数组的长度(elem.length也可以),对里面的元素进行打印,最后换行

public void display() {
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(this.elem[i] + " ");
        }
        System.out.println();
    }

3.获取顺序表的长度

直接return usedSize即可。

// 获取顺序表长度
    public int size() {
        return this.usedSize;
    }

4.默认在数组最后位置新增的add方法

只要是增加元素,就要考虑数组的容量是否充足,所以我将判断 数组是否当前空间是否满了 的判断另写了一个方法 isFull() 如果数组满了就进行2倍扩容(当前数组的长度*2),然后再数组的尾部新增元素,usedSize++。

public void add(int data) {
        if (this.isFull()) {
            Arrays.copyOf(this.elem, this.usedSize * 2);
        }
        this.elem[this.usedSize] = data;
        this.usedSize++;
    }
public boolean isFull() {
        if (this.elem.length >= this.usedSize) {
            return true;
        }
        return false;
    }

5.在指定位置新增的add方法

仍然是先要判断数组的容量,进行扩容操作,在之后就要对传入的pos位置进行判断,pos的位置一定是不能为负,也不能大于当前数组的元素个数的,如果pos不符合这两个条件,那么我们就要抛出一个异常告诉使用者。

再之后就要进行增添元素,将从pos位置一直到数组最后一个元素向后移动一个位置,然后将新元素放到pos位置,再进行usedSize++,就可以了。

public void add(int pos, int data) {
        if (this.isFull()) {
            Arrays.copyOf(this.elem, this.usedSize * 2);
        }
        if (pos < 0 || pos > this.usedSize) {
            throw new PosWrongfulException("pos位置不合法");
        }
        for (int i = this.usedSize - 1; i >= pos; i--) {
            this.elem[i + 1] = this.elem[i];
        }
        this.elem[pos] = data;
        this.usedSize++;
    }
public boolean isFull() {
        if (this.elem.length >= this.usedSize) {
            return true;
        }
        return false;
    }
//这个异常在另一个文件中,为了方便就放一起了
public class PosWrongfulException extends RuntimeException{
    public PosWrongfulException() {

    }
    public PosWrongfulException(String message) {
        super(message);
    }
}

6.判断是否包含某个元素

返回boolean类型,遍历整个顺序表即可。

// 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

7.查找某个元素对应的位置

遍历整个顺序表,找到返回下标,没找到返回-1。

// 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < this.usedSize; i++) {
            if (this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

8.获取pos位置的元素

首先判断顺序表是否为空,报异常,然后判断pos位置是否合法,当pos<0 || pos>=usedSize的时候是不合法的,报异常,经过上面的筛查,顺序表中的pos位置一定是有元素的,那么直接返回这个元素即可。

// 获取 pos 位置的元素
    public int get(int pos) {
        if (this.isEmpty()) {
            throw new PosWrongfulException("顺序表里没有元素");
        }
        if (pos < 0 || pos >= this.usedSize) {
            throw new PosWrongfulException("pos位置不合法");
        }
        return this.elem[this.indexOf(pos)];
    }

    private boolean isEmpty() {
        if (this.usedSize == 0) {
            return true;
        }
        return false;
    }

9.将pos位置的元素更新成value

和获取元素大致相同,两道筛选,判断顺序表是否为空,判断pos位置是否合法,然后修改pos位置的数值。

// 给 pos 位置的元素设为【更新为】 value
    public void set(int pos, int value) {
        if (this.isEmpty()) {
            throw new PosWrongfulException("顺序表里没有元素");
        }
        if (pos < 0 || pos >= this.usedSize) {
            throw new PosWrongfulException("pos位置不合法");
        }
        this.elem[pos] = value;
    }
private boolean isEmpty() {
        if (this.usedSize == 0) {
            return true;
        }
        return false;
    }

10.删除第一次出现的关键字key

首先判断顺序表是否为空,然后运用前面写过的方法indexOf,将key传进去,得到它的下标,如果返回不是-1,那么进行删除操作:将index + 1位置到尾部的所有元素前向平移一个位置,再将usedSize--。

public void remove(int key) {
        if (this.isEmpty()) {
            throw new PosWrongfulException("顺序表里没有元素");
        }
        int index = this.indexOf(key);
        if(index != -1) {
            for (int i = index + 1; i < this.usedSize; i++) {
                this.elem[i - 1] = this.elem[i];
            }
            this.usedSize--;
        }
    }

11.清空顺序表

两种方法:第一种比较简单粗暴,因为整个顺序表都是根据usedSize的大小进行操作的,所以第一种方法就是将usedSize = 0(如果数组中传的是引用需要全部置空)

// 清空顺序表
    public void clear() {
        /*for (int i = 0; i < this.usedSize; i++) {
            this.elem[i] = null;
        }*/
        this.usedSize = 0;
    }

第二种方法是重新new一个数组,大小还是取最开始设置的默认值,然后再将usedSize = 0

// 清空顺序表
    public void clear() {
        this.elem = new int[DEFAULT_SIZE];
        this.usedSize = 0;
    }

相关文章:

  • 金仓数据库KingbaseES数据库参考手册(服务器配置参数18. 开发者选项)
  • mysql 跨库数据清洗方案
  • pandas数据映射,更改列名,批量映射替换某列数据replace、map、apply、rename对比
  • 未婚妻晚安之后依然在线,于是我用20行代码写了个小工具
  • MySQL进阶第二天——索引
  • 低代码 low-code
  • 数字经济增长下,数据共享对于企业而言意味着什么?
  • 浙大MEM网上报名关键信息点提醒,选错一个,回头重来
  • 基于Spring Boot的动物救助中心系统
  • 6.HTML标签/元素学习
  • 没前端项目经验很难找实习吗?
  • C#基础--委托、lambda表达式和事件
  • LeetCode 0316. 去除重复字母:单调栈
  • 算法-二叉树
  • 基于统计自适应线性回归的目标尺寸预测
  • 【刷算法】求1+2+3+...+n
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • js正则,这点儿就够用了
  • Laravel核心解读--Facades
  • linux安装openssl、swoole等扩展的具体步骤
  • maya建模与骨骼动画快速实现人工鱼
  • Median of Two Sorted Arrays
  • Quartz初级教程
  • React-Native - 收藏集 - 掘金
  • spring-boot List转Page
  • TypeScript迭代器
  • vue总结
  • webpack+react项目初体验——记录我的webpack环境配置
  • 简析gRPC client 连接管理
  • 我的zsh配置, 2019最新方案
  • 学习HTTP相关知识笔记
  • kubernetes资源对象--ingress
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 如何正确理解,内页权重高于首页?
  • 正则表达式-基础知识Review
  • #图像处理
  • (JS基础)String 类型
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (转)关于pipe()的详细解析
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .NET简谈设计模式之(单件模式)
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [ajaxupload] - 上传文件同时附件参数值
  • [BZOJ 3282] Tree 【LCT】
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [DAU-FI Net开源 | Dual Attention UNet+特征融合+Sobel和Canny等算子解决语义分割痛点]
  • [docker] Docker容器服务更新与发现之consul
  • [Electron] 将应用打包成供Ubuntu、Debian平台下安装的deb包
  • [i.MX]飞思卡尔IMX6处理器的GPIO-IOMUX_PAD说明