[1] 顺序表实现

news2025/1/30 16:05:20

一、引入顺序表

提出问题:

顺序表底层是一个数组,为什么不是直接操作数组就好了,还要单独写一个类,说底层是数组呢??

因为顺序表可以有更多的操作:

比如一个数组,我们没有办法知道,里面有几个有效的数据。

 二、顺序表的实现

1、顺序表所具备的方法

public class MyArraylist {
    public int[] elem;
    public int usedSize;
    public MyArraylist(){
        this.elem = new int[10];
    }
    // 打印顺序表
    public void display() {

    }
    // 新增元素,默认在数组最后新增
    public void add(int data) {

    }
    // 在 pos 位置新增元素
    public void add(int pos, int data) {
        
    }
    // 判定是否包含某个元素
    public boolean contains(int toFind) { 
        return true;
    }
    // 查找某个元素对应的位置
    public int indexOf(int toFind) { 
        return -1;
    }
    // 获取 pos 位置的元素
    public int get(int pos) { 
        return -1; 
    }
    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        
    }
    //删除第一次出现的关键字key
    public void remove(int key) { 
        
    }
    // 获取顺序表长度
    public int size() { 
        return 0; 
    }
    // 清空顺序表
    public void clear() {
        
    }
}

2、实现各个方法

(1)打印顺序表

    // 打印顺序表
    /*
    根据usedSize判断,不能根据数组长度判断
     */
    public void display() {
        for (int i = 0; i < usedSize; i++) {
            System.out.print(this.elem[i]+" ");
        }
    }

(2)新增元素,默认在数组最后新增

 /*
       判断当前顺序表是不是满的
       true:满    false:空
     */
    public boolean isFull(){
//        if(this.usedSize == this.elem.length){
//            return true;
//        }else return false;
        //优化
        return this.usedSize == this.elem.length;
    }
    // 新增元素,默认在数组最后新增
    /*
       需要判断当前数组是否满了,为此写一个isFull方法
       1、不满进行插入
       2、满的进行扩容
     */
    public void add(int data) {
        //扩容
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[this.usedSize] =data;
        usedSize++;
    }

 (3)在 pos 位置新增元素

 // 在 pos 位置新增元素
    /*
      1、在数据结构当中,每次存储元素的时候,一定要有一个前驱信息,即插入数据不能跳着插
      2、注意事项:
        2.1 判断pos位置的合法性
        2.2 判断顺序表是否已满
        2.3 插入数据 -> 1.挪动数据 2.插入数据
    */
    private boolean checkPosInAdd(int pos){ //封装起来,使得程序更安全
        if(pos <0 || pos >this.usedSize){
            return false;
        }
        return true;
    }
    public void add(int pos, int data) {
        //判断下标是否合法
        if(!checkPosInAdd(pos)){
            throw new MyArrayListIndexIllegal("pos位置不合法");
        }
        //判断是否满的
        if(isFull()){
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //挪数据
        for (int i = this.usedSize-1; i <=pos ; i--) {
            this.elem[i+1] = this.elem[i];
        }
        this.elem[pos] = data;
        usedSize++;
    }

自定义异常:

public class MyArrayListIndexIllegal extends RuntimeException{
    public MyArrayListIndexIllegal(){

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

(4)判定是否包含某个元素

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

(5)查找某个元素对应的位置

如果数组存放的是类类型, 如Person person = new Person();

此时需要重写equals方法

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

(6) 获取 pos 位置的元素

    // 获取 pos 位置的元素
    private boolean checkPosInGet(int pos){
        if(pos<0 || pos>=this.usedSize){
            return false;
        }return true;
    }
    private boolean isEmpty(){
        return this.usedSize == 0;
    }
    public int get(int pos) {
        if(!checkPosInGet(pos)){
            throw new MyArrayListIndexIllegal("获取pos下标时,位置不合法");
        }
        if(isEmpty()){
            throw new MyArrayListEmptyException("获取元素的时候,数组为空");
        }
        return this.elem[pos];
    }

自定义异常:

public class MyArrayListEmptyException extends RuntimeException{
    public MyArrayListEmptyException(){

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

(7) 给 pos 位置的元素设为 value

    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        if(!checkPosInGet(pos)){
            throw new MyArrayListIndexIllegal("获取pos下标时,位置不合法");
        }
        this.elem[pos] =value;
    }

(8)删除第一次出现的关键字key

    //删除第一次出现的关键字key
    /*
    1.顺序表不为空
    2。顺序表有所要删除的元素key
    3.找到key的下标i
    4.将elem[i+1]的值覆盖elem[i]的值 即elem[i] = elem[i+1],usedSize--;
    5.注意:如果是引用类型的数组,就需要把elem[i] = null;
     */
    public void remove(int key) {
        if(isEmpty()){
            throw new MyArrayListEmptyException("顺序表为空,不能删除");
        }
        int index = indexOf(key);
        if(index > 0){
            for (int i = index; i < usedSize-1; i++) {
                elem[i] = elem[i+1];
            }
            System.out.println("删除完成");
            this.usedSize--;
        }else {
            System.out.println("不存在你要删除的对象");
        }
    }

(9)获取顺序表长度

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

(10)清空顺序表

    // 清空顺序表
    public void clear() {
      this.usedSize = 0;
      /*
      如果是引用数据类型,需要一个一个置为空
      for (int i = 0; i < this.usedSize;i++) {
            elem[i] = null;
        }
        this.usedSize = 0;
       */
        /*
        或者直接把elem置为空,但这样太粗暴了,直接把elem回收了,就不能对elem进行操作了
           this.elem =null;
         */
    }

三、源码

_20230409 · benxiangsj/java learning - 码云 - 开源中国 (gitee.com)icon-default.png?t=N2N8https://gitee.com/benxiangsj/java-learning/tree/fe7ae6e425c4a0ed5bd886a923630e2293c90ff8/_20230409/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413440.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 11.0 原生SystemUI下拉通知栏UI背景设置为圆角背景的定制(二)

1.前言 在11.0的系统rom定制化开发中,在原生系统SystemUI下拉状态栏的下拉通知栏的背景默认是白色四角的背景, 由于在产品设计中,在对下拉通知栏通知的背景需要把四角背景默认改成圆角背景,所以就需要分析系统原生下拉通知栏的每条通知的默认背景, 然后通过systemui的通知…

MobTech 秒验|极速验证,拉新无忧

一、运营拓展新用户的难题 运营拓展新用户是每个应用都需要面对的问题&#xff0c;但是在实际操作中&#xff0c;往往会遇到一些困难。其中一个主要的难题就是注册和登录的繁琐性。用户在使用一个新的应用时&#xff0c;通常需要填写手机号、获取验证码、输入验证码等步骤&…

Java-红黑树的实现

目录一、概述二、红黑树的操作1. 变色2. 左旋与右旋3. 插入节点4. 删除节点三、手写代码1. 通用方法2. 中序遍历3. 左旋4. 右旋5. 添加节点6. 删除节点四、完整代码五、测试1. 红黑树打印类2. 测试代码3. 测试结果一、概述 关于红黑树的学习&#xff0c;先推荐给大家一个网址&…

Centos7安装部署Jenkins

Jenkins简介&#xff1a; Jenkins只是一个平台&#xff0c;真正运作的都是插件。这就是jenkins流行的原因&#xff0c;因为jenkins什么插件都有 Hudson是Jenkins的前身&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控程序重复的工作&#xff0c;Hudson后来被…

文章自动生成器 -原创文章生成器在线版

怎么将ChatGPT生成文章保存 在使用ChatGPT生成文章后&#xff0c;您可以使用以下几种方法将其保存起来&#xff1a; 复制粘贴&#xff1a;最简单的方法是将生成的文章文本复制并粘贴到文本编辑器或其他文本处理软件中&#xff0c;如Word文档或Google Docs&#xff0c;以保存文…

I2C通信

一、理论上了解I2C时序 I2C写数据时序如图&#xff1a; 通过解析器解析I2C通信如上图&#xff08;SCL和SDA反了&#xff09;。 1---起始信号 2、3---应答信号ACK 5---停止信号 起始信号&#xff1a;SCL线是高电平时&#xff0c;SDA线从高电平向低电平切换。 停…

一个大二学生送给大一学弟学妹的建议

博主简介&#xff1a;先简单的介绍一下我吧&#xff0c;本人是一名大二学生&#xff0c;来自四川。目前所学专业是人工智能&#xff0c;致力于在CSDN平台分享自己的学习内容。 我为什么要写这篇文章&#xff1f; 我来到CSDN也已经一年了&#xff0c;在这一年里面&#xff0c;我…

go binary包

binary包使用与详解 最近在看一个第三方包的库源码&#xff0c;bigcache&#xff0c;发现其中用到了binary 里面的函数&#xff0c;所以准备研究一下。 可以看到binary 包位于encoding/binary&#xff0c;也就是表示这个包的作用是编辑码作用的&#xff0c;看到文档给出的解释…

加密的本质:数学的不对称性

文章目录 引言I 预备知识1.1 加密和授权1.2 非对称的特性II 椭圆曲线加密的方法2.1 椭圆曲线2.2 椭圆曲线的性质引言 不对称有时却自有其妙处与美感,比如黄金分割就是不对称的。 可以通过加密和授权,兼顾保护信息不外泄,而且某些得到授权的人还能使用信息。 I 预备知识 …

2022年人民满意手机银行发展洞察

易观&#xff1a;商业银行积极践行“金融为民”&#xff0c;坚持“以用户为中心”的发展理念&#xff0c;从全客群、全服务、全渠道推动金融服务触达广大人民群众。其中&#xff0c;手机银行作为服务及经营主阵地&#xff0c;是人民群众获取金融服务的超级入口及服务平台。 “以…

键盘摄影:今天老李是一名动物摄影师

键摄&#xff0c;全称键盘摄影师。原本是一个贬义词&#xff0c;是指那些没有相机&#xff0c;没有实拍经验&#xff0c;仅凭一副鼠标键盘&#xff0c;在家里打字&#xff0c;在网上头头是道地分享摄影技巧&#xff0c;同时对别人的作品指指点点&#xff0c;然后又无法秀出自己…

中国上海人工智能企业中集飞瞳全球港航AI独角兽企业,成熟智慧港航AI产品,数字化港口自动化码头智慧港航智能化中国上海人工智能企业

中国上海人工智能企业中集飞瞳全球港航AI独角兽企业&#xff0c;成熟智慧港航AI产品&#xff0c;数字化港口自动化码头智慧港航。CIMCAI打造全球领先新一代集装箱管理方案&#xff0c;手机小程序随时随地AI验箱&#xff0c;自动化箱况检测信息识别&#xff0c;集装箱信息识别箱…

总线的控制

总线控制 目录总线控制总线的判优控制链式查询计数器定时查询独立请求小结总线通信控制同步通信异步通信半同步通信分离通信由于总线上连接着多个部件&#xff0c;什么时候由哪个部件发送信息&#xff0c;如何给传送信息定时&#xff0c;如何防止信息丢失&#xff0c;如何避免多…

React源码解析之createElement和render方法

参考资料 请注意&#xff0c;这是React16.8的源码解析&#xff0c;当然他完全可以作为你阅读源码的参考&#xff0c;他还没有落后。 Step1 开始之前&#xff0c;要先了解一个知识点⬇️ 我们都知道&#xff0c;要在JSX中写React语法&#xff0c;那为什么不能在js文件中写呢&am…

微搭使用笔记(六) 通过源码组件实现小程序端地图

前言 微搭官方提供了大量常用组件&#xff0c;但由于微搭本身也是在不断地完善过程中&#xff0c;有些组件还是没有提供&#xff0c;但同时微搭允许用户自定义组件并在应用中使用。 实际场景是这样的&#xff0c;我们需要一个地图页面在上面展示已知设备的信息和位置&#xf…

CentOS7 虚拟机 双网卡绑定

一、网卡绑定模式 模式类型特点mode0round-robin&#xff08;平衡轮询策略&#xff09;基于per packet方式&#xff0c;轮询往每条链路发送报文。提供负载均衡和容错的能力&#xff0c;当有链路出问题&#xff0c;会把流量切换到正常的链路上。交换机端需要配置聚合口。mode1a…

Linux网络编程(四)——UDP通信

目录 0x01 UDP协议 一、UDP通信简介以及接口 二、UDP的接口 三、UDP收发例程 0x02 广播 一、设置广播数据函数接口 二、广播代码实现 0x03 组播&#xff08;多播&#xff09; 一、组播地址 二、设置组播函数接口 三、代码实现 0x01 UDP协议 一、UDP通信简介以及接口…

《Netty》从零开始学netty源码(三十六)之ChannelConfig

ChannelConfig 在前面创建NioServerSocketChannel的 构造函数中&#xff0c;最后一步创建了channel属性的配置类NioServerSocketChannelConfig&#xff0c;本文详细分析下该类&#xff0c;先看下其类结构图。 类结构图 服务端使用的NioServerSocketChannelConfig&#xff0c;…

ELK日志分析系统+zookeeper

ELK日志分析系统zookeeper一、zookeeper简介1、zookeeper概念2、zookeeper数据结构二、zookeeper工作机制1、zookeeper特点2、zookeeper应用场景三、zookeeper集群部署1、安装前先关闭防火墙 核心防护2、安装JDK3、安装zookeeper4、修改配置文件5、创建数据目录和日志目录&…

JavaEE-网络原理之UDP协议

目录UDP报文结构UDP的特点无连接不可靠面向数据报缓冲区基于UDP的应用层协议UDP报文结构 报头大小为8个字节. 16位源端口号与16位目的端口号: 16个比特位可表示65536个端口号,分别为0-65535,其中1-1023为为专属端口号,用来为一些知名服务器提供服务,例如: HTTP服务器专属端口号…