锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. Java数据结构——代码实现顺序表的操作

Java数据结构——代码实现顺序表的操作

0
  • 软件开发
  • 发布于 2024-09-19
  • 0 次阅读
黄健
黄健

作者:敲代码の流川枫

博客主页:流川枫的博客

专栏:和我一起学java

语录:Stay hungry stay foolish

工欲善其事必先利其器,给大家介绍一款超牛的斩获大厂offer利器——牛客网

点击免费注册和我一起刷题吧

文章目录

顺序表

1.获取顺序表长度

2.打印顺序表中的所有元素

3.新增一个元素,默认在最后新增

4.在 pos 位置新增元素

5.判定是否包含某个元素

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

7.获取 pos 位置的元素

8.给 pos 位置的元素更新为 value

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

10.清空顺序表



顺序表

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

接下来我们自己实现一些接口对数组进行增删查改的操作

创建一个类:

public class MyArrayList {
    public int[] elem;//数组
    public int usedSize;//记录有效数据的个数
    public static final int DEFAULT_SIZE = 10;
    public MyArrayList(int[] elem){
        this.elem = new int[DEFAULT_SIZE];
    }

1.获取顺序表长度

public int size() {
        return this.usedSize;
}

2.打印顺序表中的所有元素

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

3.新增一个元素,默认在最后新增

步骤:检查当前顺序表是否满了;如果满了进行扩容;然后将元素放进去;usedSize++;

判满:

public boolean isFull(int[] elem){
        if(size()>=this.usedSize){
            return true;
        }
        else return false;
}

扩容:

 public void add(int data){
        if(isFull()){
            this.elem = 
                    Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //添加数据
        this.elem[this.usedSize] = data;
        //有效数据加一
        this.usedSize++;

}

测试:

public class TestList {
    public static void main(String[] args) {
        MyArrayList myArrayList = new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.disPlay();
    }
}

4.在 pos 位置新增元素

注意:负数下标不能当Pos;不能超过数组长度插入;不能间隔着插入,即插入的位置前面一定有元素;

还是先判断数组是否满,满了扩容;然后判断pos位置是否合法;不合法抛出异常;插入后将其他元素后移

 public void add(int pos, int data) {
        if(isFull()){
            System.out.println("满了");
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        if(pos<0||pos>this.usedSize){
            System.out.println("pos位置不合法");
            throw new PosworongfulException("pos位置不合法");
        }
        //pos一定合法
        // 挪动数据
        for (int i = this.usedSize-1; i>=pos  ; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //插入数据
        this.elem[pos] = data;
        //usedSize++
        this.usedSize++;
}

添加10到1位置

try {
                myArrayList.add(1,10);
        }
        catch (PosworongfulException e){
                e.printStackTrace();
        }
                myArrayList.disPlay();

在10位置添加数据

try {
                myArrayList.add(10,10);
        }
        catch (PosworongfulException e){
                e.printStackTrace();
        }
                myArrayList.disPlay();

5. 判定是否包含某个元素

public boolean contains(int toFind) {
        for (int i = 0; i < this.size(); i++) {
            if(elem[i]==toFind){
                return true;
            }
        }
        return false;
}


    System.out.println("-------------");
    System.out.println(myArrayList.contains(10));
    System.out.println(myArrayList.contains(100));

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

public int indexOf(int toFind) {
        for (int i = 0; i < this.size(); i++) {
            if(this.elem[i]==toFind){
                return i;
            }
        }
        return -1;
}

        System.out.println("-------------");
        System.out.println(myArrayList.indexOf(3));

7.获取 pos 位置的元素

//判断为空
    public boolean isEmpty(){
        return size()==0;
    }
    // 获取 pos 位置的元素
    public int get(int pos) {
        if(isEmpty()){
            throw new EmptyException("当前顺序表为空");
        }
        if(pos<0||pos>=this.usedSize){
            throw new PosworongfulException("pos位置不合法");
        }
        return this.elem[pos];
    }

    System.out.println("------------");
    System.out.println(myArrayList.get(0));
     try {
          myArrayList.get(10);
     }catch (PosworongfulException e){
           e.printStackTrace();
     }

8.给 pos 位置的元素更新为 value

public void set(int pos, int value) {
        if(isEmpty()){
            throw new EmptyException("顺序表为空");
        }
        if(pos<0||pos>=this.usedSize){
            throw new PosworongfulException("pos位置不合法");
        }
        this.elem[pos] = value;

    }

      System.out.println("---------");
      myArrayList.set(0,100);
      myArrayList.disPlay();

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

空表没有key

先找到key,找到下标

挪动数据

usedSize–

public void remove(int key) {
        if(isEmpty()){
            throw new EmptyException("顺序表为空");
        }
        int index = this.indexOf(key);
        if(index==-1){
            System.out.println("没有这个数字");
        }
        for (int i = index; i < size()-1; i++) {
                this.elem[i] = this.elem[i+1];
        }
        this.usedSize--;
    }

        System.out.println("---------");
        myArrayList.remove(3);
        myArrayList.disPlay();

10.清空顺序表

此处顺序表元素不是引用类型,可直接将usedSize变为0来清空顺序表,如果是引用类型,则必须全部置空,否则会造成内存泄漏,空间无法回收

    public void clear() { 
        this.usedSize = 0;
    }

" 本期的分享就到这里了, 记得给博主一个三连哈,你的支持是我创作的最大动力!


原文链接: https://blog.csdn.net/chenchenchencl/article/details/126892216

标签: #软件开发 1171 #JAVA 991
相关文章

万字:支付“核心系统”详解 2024-11-02 15:33

专栏作者:隐墨星辰 \| 主编:陈天宇宙 这篇文章也尝试化繁为简,探寻支付系统的本质,讲清楚在线支付系统最核心的一些概念和设计理念。 虽然支付行业已经过了风头最劲的时光,但跨境支付仍然在蓬勃发展,每年依然有很多新人进入这个行业,这篇文章尝试为这些刚入行的新人提供一点帮助。 文章只介绍一些支付行业十几

资深支付架构师视角:实战从问题定义到代码落地的完整套路 2024-11-02 15:33

前言 今天从一个实际案例入手,介绍站在架构师的角度,如何识别并定义问题,提炼需求,技术方案选型,再到详细设计,最后利用AI的能力协助写出核心的代码,验证与调优。 解决问题存在一定的模式,也可以称之为框架,总结出自己的思考和解题框架,以后再碰到同类型的问题就可以如庖丁解牛一样容易。 很多年前,我写代码

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

设计模式第16讲——迭代器模式(Iterator) 2024-10-08 11:24

一、什么是迭代器模式 迭代器模式是一种行为型设计模式,它提供了一种统一的方式来访问集合对象中的元素,而不是暴露集合内部的表示方式。简单地说,就是将遍历集合的责任封装到一个单独的对象中,我们可以按照特定的方式访问集合中的元素。 二、角色组成 抽象迭代器(Iterator):定义了遍历聚合对象所需的方法

vue2路由和vue3路由区别及原理 2024-10-08 11:24

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中,通过 Vue.use() 注册路由插件,并通过 new VueRouter() 来创建路由实例。 import Vue from 'vue';import VueRouter from 'vue-router';i

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.