数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题

news2025/2/28 6:31:13

🧸欢迎来到dream_ready的博客,📜相信你对这篇博客也感兴趣o (ˉ▽ˉ;)

📜ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码)

目录

顺序表简介

自定义顺序表

SeqList —— 构造方法

display —— 打印顺序表

fullResize —— 判断是否满了,满了则扩容

add —— 新增元素,默认在数据最后

add —— 在任意位置新增元素

contains —— 判断是否包含某个元素

indexOf —— 查找某个元素对应的位置下标

checkPos —— 判断参数是否合法

get —— 获取 pos 位置的元素

set —— 修改/更新元素

size —— 获取顺序表的长度

remove —— 删除第一次出现的关键字key

clear —— 清空顺序表

自定义顺序表全部代码

自定义异常类

自定义顺序表的测试用例

Java中自带的顺序表 —— ArrayList


顺序表简介

        顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改

自定义顺序表

        以下是顺序表的类以及相关方法,接下来我将带着你手把手地将里面的方法补充完讲解代码逻辑,只想看完整源码的下拉到最下面或点击目录中的完整源码,即可直接到对应位置

        首先,此处顺序表我们选择底层是由数组来实现,并定义一个变量存放数组有效元素个数,一个常量用来初始化数组的内存空间

public class SeqList {
    private int[] array;
    private int size;
    // 默认构造方法
    SeqList(){ }
    // 判断是否满了,如果满了,自动扩容
    public void fullResize(){   }
    // 新增元素,默认在数组最后新增
    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 toRemove) { }
    // 获取顺序表长度
    public int size() { return 0; }
    // 清空顺序表
    public void clear() { }
    // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    public void display() { }
}

SeqList —— 构造方法

定义构造方法,初始化数组长度/空间,长度为上面定义的常量

    // 构造方法,初始化5个空间
    public SeqList(){
        this.elem = new int[DEFAULT_CAPACITY];
    }

display —— 打印顺序表

遍历顺序表,打印每个有效元素

    // 打印顺序表
    public void display(){
        for(int i = 0; i < this.count; i++){
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }

fullResize —— 判断是否满了,满了则扩容

判断是否满了,如果满了,自动扩容

    // 判断是否满了,如果满了,自动扩容
    public void fullResize(){
        if(this.elem.length == count){
            elem = Arrays.copyOf(elem, 2*elem.length);
        }
    }

add —— 新增元素,默认在数据最后

        新增元素,默认在数据最后,add执行开始,先调用fullResize判断顺序表是否满了,满了则先扩容,再添加元素,因为满了的情况下,没有位置可添加元素

    // 新增元素,默认在数据最后
    public void add(int data){
        fullResize();
        elem[count] = data;
        count++;
    }

add —— 在任意位置新增元素

        在pos位置新增元素,先判断pos是否合法,比如插入下标位置为-1或超出数组有效元素个数范围,那肯定不合法,不合法即抛出异常,这里的异常是我们自己定义的,目录中点击 自定义异常类 即可跳转,也可手动往下翻看

如果合法则挪动数据并插入

为什么有两个add?

这里属于方法的重载,会根据传递的参数自动选择对应的add方法

    // 在 pos 位置新增元素
    public void add(int pos, int data){
        fullResize();
        if(pos < 0 || pos > this.count){
            throw new PosOutBoundsException("add 数据时,位置不合法!");
        }
        // 挪动数据
        for(int i = this.count; i > pos; i--){
            this.elem[i] = this.elem[i-1];
        }
        // 存数据
        this.elem[pos] = data;
        this.count++;
    }

contains —— 判断是否包含某个元素

遍历顺序表,依次比较

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

indexOf —— 查找某个元素对应的位置下标

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

checkPos —— 判断参数是否合法

此处的是否合法范围的右边界是按有效元素个数来计算的

    // 判断参数是否合法(按有效元素算)
    public boolean checkPos(int pos){
        if(pos < 0 || pos >= this.count){
            return false;
        }
        return true;
    }

get —— 获取 pos 位置的元素

如果pos不合法,则抛出异常

    // 获取pos位置的元素
    public int get(int pos){
        if(!checkPos(pos)){
            throw new PosOutBoundsException("get 数据时,位置不合法!");
        }
        return this.elem[pos];
    }

set —— 修改/更新元素

给pos位置的元素设置为value [修改/更新]

    // 给pos位置的元素设置为value [修改、更新]
    public void set(int pos, int value){
        if(!checkPos(pos)){
            throw new PosOutBoundsException("set 数据时,位置不合法! ");
        }
        this.elem[pos] = value;
    }

size —— 获取顺序表的长度

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

remove —— 删除第一次出现的关键字key

    // 删除第一次出现的关键字key
    public void remove(int toRemove){
        // 如果列表为空,直接返回
        if(this.count == 0){
            return;
        }
        int index = indexOf(toRemove);
        if(index == -1){
            return;  //没有要删除的关键字
        }
        for(int i = index; i < this.count-1; i++){
            this.elem[i] = this.elem[i+1];
        }
        this.count--;
    }

clear —— 清空顺序表

    // 清空顺序表
    public void clear(){
        this.count = 0;
    }

自定义顺序表全部代码

下面的代码在上面都有,只是下面将其完整的展示了出来,供您更有效地复制和阅读代码

友情提示:下面中的 PosOutBoundsException 是我们自定义的异常,目录中点击 自定义异常类 即可跳转,也可手动往下翻看

import java.util.Arrays;

// 顺序表
public class SeqList {
    private int[] elem;
    private int count;   // 计算当前存储有效元素个数

    private static final int DEFAULT_CAPACITY = 5;  // 初始化内存空间

    // 构造方法,初始化5个空间
    public SeqList(){
        this.elem = new int[DEFAULT_CAPACITY];
    }

    // 打印顺序表
    public void display(){
        for(int i = 0; i < this.count; i++){
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }

    // 判断是否满了,如果满了,自动扩容
    public void fullResize(){
        if(this.elem.length == count){
            elem = Arrays.copyOf(elem, 2*elem.length);
        }
    }
    // 新增元素,默认在数据最后
    public void add(int data){
        fullResize();
        elem[count] = data;
        count++;
    }


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

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

    // 判断参数是否合法(按有效元素算)
    public boolean checkPos(int pos){
        if(pos < 0 || pos >= this.count){
            return false;
        }
        return true;
    }

    // 获取pos位置的元素
    public int get(int pos){
        if(!checkPos(pos)){
            throw new PosOutBoundsException("get 数据时,位置不合法!");
        }
        return this.elem[pos];
    }

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

    // 给pos位置的元素设置为value [修改、更新]
    public void set(int pos, int value){
        if(!checkPos(pos)){
            throw new PosOutBoundsException("set 数据时,位置不合法! ");
        }
        this.elem[pos] = value;
    }

    // 在 pos 位置新增元素
    public void add(int pos, int data){
        fullResize();
        if(pos < 0 || pos > this.count){
            throw new PosOutBoundsException("add 数据时,位置不合法!");
        }
        // 挪动数据
        for(int i = this.count; i > pos; i--){
            this.elem[i] = this.elem[i-1];
        }
        // 存数据
        this.elem[pos] = data;
        this.count++;
    }

    // 删除第一次出现的关键字key
    public void remove(int toRemove){
        // 如果列表为空,直接返回
        if(this.count == 0){
            return;
        }
        int index = indexOf(toRemove);
        if(index == -1){
            return;  //没有要删除的关键字
        }
        for(int i = index; i < this.count-1; i++){
            this.elem[i] = this.elem[i+1];
        }
        this.count--;
    }


    // 清空顺序表
    public void clear(){
        this.count = 0;
    }
}

自定义异常类

单独定义一个.Java文件存写该代码

        用来在下标不合法等情况下抛出异常,第二个构造方法的意思是抛出异常时会打印出message中的信息

// 自定义异常类
public class PosOutBoundsException extends RuntimeException{
    public PosOutBoundsException(){

    }

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

自定义顺序表的测试用例

        此段代码用来验证我们写的自定义顺序表是否正确以及功能完整程度,从测试可以看出我们写的代码非常Good

public class Main {
    public static void main(String[] args) {
//        SeqList seqList = new SeqList();
//        for(int i = 0; i < 10; i++){
//            seqList.add(i,i*10);
//        }
//        seqList.display();

        SeqList list = new SeqList();

        // 添加元素并打印列表
        list.add(1);
        list.add(2);
        list.add(3);
        list.display(); // 应该打印 "1 2 3 "

        // 判断是否包含某个元素
        System.out.println(list.contains(2)); // 应该打印 true
        System.out.println(list.contains(4)); // 应该打印 false

        // 查找元素的位置下标
        System.out.println(list.indexOf(3)); // 应该打印 2
        System.out.println(list.indexOf(4)); // 应该打印 -1

        // 获取元素
        System.out.println(list.get(0)); // 应该打印 1
        System.out.println(list.get(2)); // 应该打印 3

        // 获取列表长度
        System.out.println(list.size()); // 应该打印 3

        // 设置元素
        list.set(1, 5);
        list.display(); // 应该打印 "1 5 3 "

        // 在指定位置插入元素
        list.add(1, 4);
        list.display(); // 应该打印 "1 4 5 3 "

        // 删除第一次出现的元素
        list.remove(4);
        list.display(); // 应该打印 "1 5 3 "

        // 清空列表
        list.clear();
        list.display(); // 应该打印空行
        System.out.println(list.size()); // 应该打印 0
    }
}

控制台输出结果如下:(完全正确)

Java中自带的顺序表 —— ArrayList

📜ArrayList简介及使用全方位手把手教学(带源码),用ArrayList实现洗牌算法,3个人轮流拿牌(带全部源码)

🧸至此,感谢您阅读这篇博客,祝您生活愉快! o (ˉ▽ˉ;)

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

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

相关文章

法律咨询服务预约小程序的作用

纠纷不断&#xff0c;法律服务的需求度非常高&#xff0c;公司/个人在多个场景都有可能使用到法律业务&#xff0c;对相关咨询机构来说&#xff0c;需要不断拓展客源和品牌宣传以获得更多生意增长&#xff0c;然而线下拓展困难&#xff0c;线上是商家们发展的必要渠道。 那么通…

怎么在现货黄金交易过程中高效设置止损?

投资市场中的风险具有客观及普遍性&#xff0c;现货黄金买卖也是如此&#xff0c;作为典型的国际性交易产品之中&#xff0c;在现货黄金买卖过程中人们要灵活应对行情变化&#xff0c;从中争取盈利空间。而设置止损就是防止风险扩大的一条有效措施&#xff0c;所以炒金者们应当…

聊聊 Rust 变量,你学会了吗?

Rust 是一门强调安全、并发、高效的系统编程语言。无 GC 实现内存安全机制、无数据竞争的并发机制、无运行时开销的抽象机制&#xff0c;是 Rust 独特的优越特性。 它声称解决了传统 C 语言和 C语言几十年来饱受责难的内存安全问题&#xff0c;同时还保持了很高的运行效率、很深…

第4天:基础入门-30余种加密编码进制amp;Webamp;数据库amp;系统amp;代码amp;参数值

第4天&#xff1a;基础入门-30余种加密编码进制&Web&数据库&系统&代码&参数值 一、知识点 1. 存储密码加密-Web&数据库&系统2. 传输数据编码-各类组合传输参数值3. 代码特性加密-JS&PHP&NET&JAVA4. 数据显示编码-字符串数据显示编码二…

资源限流 + 本地分布式多重锁——高并发性能挡板,隔绝无效流量请求

前言 在高并发分布式下&#xff0c;我们往往采用分布式锁去维护一个同步互斥的业务需求&#xff0c;但是大家细想一下&#xff0c;在一些高TPS的业务场景下&#xff0c;让这些请求全部卡在获取分布式锁&#xff0c;这会造成什么问题&#xff1f; 瞬时高并发压垮系统 众所周知…

C#开发的OpenRA游戏之选择建筑物显示状态信息

C#开发的OpenRA游戏之选择建筑物显示状态信息 前面已经分析了金钱系统,有了钱之后,就可以放任地建造万物了。 在建造的过程中,当你选择建筑物时,就可以看到当前建筑物的健康信息和制造当前物品的进度,如下图所示: 从上图可以看到最上面的进度条是这个建筑物的健康程度,…

Java 代码读取自定义的配置文件里面的东西

目录 1 问题2 实现 1 问题 Java 代码读取自定义的配置文件里面的东西&#xff0c;在代码里面进行使用。 也就是随便一个配置文件&#xff0c;如何在代码里面进行读取 2 实现 将配置文件&#xff0c;随便起一个名字&#xff0c;将这个配置文件写到 resource 这个目录下&#…

Java调用HTTPS接口,绕过SSL认证

1&#xff1a;说明 网络编程中&#xff0c;HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;是一种通过加密的方式在计算机网络上进行安全通信的协议。网络传输协议&#xff0c;跟http相比更安全&#xff0c;因为他加上了SSL/TLS协议来加密通信内容。 Java调…

主播直播美颜SDK:性能优化策略

当下&#xff0c;主播直播美颜SDK成为了越来越多主播的利器。这些SDK可以实时美化主播的外貌&#xff0c;提高视觉吸引力&#xff0c;但同时也需要处理大量的图像数据。因此&#xff0c;性能优化成为了不可或缺的一环。本文将探讨主播直播美颜SDK的性能优化策略&#xff0c;以确…

【word技巧】word文档如何转换为ppt文件?

大家是否会遇到需要将word文档转换为ppt文件的情况&#xff1f;除了反反复复粘贴复制以外&#xff0c;还有其他方法可以转换文件格式&#xff0c;今天给大家分享word转换ppt方法。 首先我们先将word文件打开大纲模式 然后我们将文中的大标题设置为1级标题&#xff0c;副标题设…

【C++初阶】——初始化列表static成员友元内部类匿名对象

个人主页点击直达&#xff1a;小白不是程序媛 C系列专栏&#xff1a;C头疼记 代码仓库&#xff1a;Gitee 目录 前言 再谈构造函数 初始化列表 explicit关键字 匿名对象 static成员 友元 友元函数 友元类 内部类 再次理解类和对象 前言 前几篇文章我们对于分别对C类…

未来的无人驾驶时代会对我们带来哪些影响?

未来的无人驾驶时代&#xff1a;无人驾驶技术发展现状、未来趋势以及迈入无人驾驶时代后会给我们带来哪些积极影响 过去&#xff0c;说起无人驾驶汽车&#xff0c;就像是科幻小说中的情节。但时至今日&#xff0c;这种情况已经改观&#xff1a;谷歌、特斯拉、福特等多家大型公…

docker打包container成image,然后将image上传到docker hub

第一步&#xff1a;停止正在运行的容器 docker stop <container_name> eg: docker stop xuanjie_mlir 第二步&#xff1a;将对应的container打包成image docker commit <container_id> <镜像名&#xff1a;版本> eg&#xff1a;docker commit 005672e6d97a…

开放式耳机能保护听力吗,开放式耳机跟骨传导耳机哪个更好?

如果从严格意义上来讲的话&#xff0c;开放式耳机中的骨传导耳机是能保护听力&#xff0c;现如今的开放式耳机是一个统称&#xff0c;将所有不入耳的类目全部规划到一块。因此在开放式耳机中存在着一些耳机是只能够保持周边环境音&#xff0c;而不是保护听力的。 下面让我来给…

基于单片机设计的电子柜锁

一、前言 随着现代社会的不断发展&#xff0c;电子柜锁的应用越来越广泛。传统的机械柜锁存在一些不便之处&#xff0c;例如钥匙容易丢失、密码容易泄露等问题。设计一款基于单片机的电子柜锁系统成为了一个有趣而有意义的项目。 该电子柜锁系统通过电磁锁作为柜锁的开关&…

esp32 WiFi连接失败后,可打印错误码分析连接失败的原因

esp32 WiFi连接失败后,可打印错误码分析连接失败的原因; 在事件中添加红色选框中的代码: WiFi连接失败错误码如下所示: REASON_UNSPECIFIED = 1,REASON_AUTH_EXPIRE = 2,REASON_AUTH_LEAVE = 3,REASON_ASSOC_EXPIRE …

基于uniapp与uview做一个按拼音首字母排序的通讯录页面

效果图&#xff1a; 第一步导入pinyin库并应用&#xff0c;用于区分汉字的拼音首字母 npm i pinyin import pinyin from "pinyin" 完整算法&#xff1a; function getListByPinyinFirstLetter(data) {const newList {};for (const item of data) {let firstLett…

AI全栈大模型工程师(十四)数据连接封装

文章目录 二、数据连接封装2.1 文档加载器:Document Loaders2.2 文档处理器2.3 文档向量化:Text Embeddings2.4 向量的存储(与索引):Vectorstores2.5 向量检索:Retrievers后记二、数据连接封装 2.1 文档加载器:Document Loaders !pip install pypdffrom langchain.docu…

MICCAI2023论文多模态论文速读-1

文章目录 1.Attentive Deep Canonical Correlation Analysis for Diagnosing Alzheimer’s Disease Using Multimodal Imaging Genetics2.Bidirectional Mapping with Contrastive Learning on Multimodal Neuroimaging Data3.CoLa-Diff: Conditional Latent Diffusion Model f…

ruoyi系统改造

前端启动报错&#xff1a;Error: error:0308010C:digital envelope routines::unsupported 修改ruoyi-ui/package.json&#xff0c;添加export NODE_OPTIONS–openssl-legacy-provider && "scripts": {"dev": "export NODE_OPTIONS--openssl…