【Java】认识顺序表及常用操作函数(干货满满!!)

简介: 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

一、线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...

线性表在逻辑上是线性结构,也就说是连续的一条直线。

但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组链式结构的形式存储。


二、什么是顺序表?

首先顺序表的底层是一个数组

为什么不直接使用数组??
在这里插入图片描述

我们来画一个图:(请问这个数组里面有多少有效数据??)

在这里插入图片描述

有人就会说:不是3个吗???
在这里插入图片描述
我说:不要自己数,让程序来知道??

别人说:等于0的时候就跳出来嘛 count计数一下!!!

这样是不可行的:
在这里插入图片描述
我要是0也是数据呢?对吧,这里就有问题。

那么我们可以定义一个变量:这个变量叫做 useSide (代表当前里面有多少有效数据)

这里代表里面有4个数据:
在这里插入图片描述

这里代表里面有4个有效数据:

在这里插入图片描述

所以这就是顺序表的引出:一个顺序表不只一个数组就可以实现,还需要其他的变量(比如(usedSize)


代码实现:
首先我们发现这个对象就是一个 顺序表,里面有数组和 有效数组 变量和一个数组容量:

在这里插入图片描述

看一些main里面实例化对象在内存的一个布局:

在这里插入图片描述
#### 实现顺序表:

基本构成代码:

数组 ,有效数组, 可用容量
public class MyArrayList {
    public int[] elem;  //数组
    public int useSize; //有效数组
    public static int capacity = 10; //可用容量

    public MyArrayList() {   //使用构造方法 初始容量
        this.elem = new int[capacity];
    }
}

三、顺序表的常用操作实现:

要实现的功能:一个个来看

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

(1) 在 pos 位置新增元素

给定指定的位置放入指定的数据:
在这里插入图片描述
先来说一下思路吧:

  1. 判断数组是否满
  2. 判断存放的位置下标是否合法(会不会数组越界)
  3. 如果满了实现扩容
  4. 想存放数据在数组,首先要把后面的数组往后面放一步,这样前面才会有位置放
  5. 存放好数据记住useSize++;(有效数据加1)

我们来看一下图片解析:也是把数组最后的元素往后移动一位
在这里插入图片描述

以上是代码思路,我们来看一下代码是怎么样实现的吧!

 public boolean isFull(){
            //1. 满的情况
            return this.useSize==capacity; //判断useSize和最大容量一样吗 一样就满了
        }

// 在 pos 位置新增元素
        public void add(int pos, int data) {
            if(pos<0 || pos>this.useSize){ //判断下标是否合法
                System.out.println("下标位置不合法");
                return;
            }
            if(isFull()){                //扩容数组大小数组大小
                this.elem = Arrays.copyOf(this.elem,2*capacity); //扩容要新拷贝一份
                capacity *=2;       //容量也要变大
            }

            for (int i = useSize-1; i >=pos ; i--) {
                this.elem[i+1] = this.elem[i];  //当前元素移动到后i+1的位置
            }
            this.elem[pos] = data;
            this.useSize++;
        }

(2) 打印顺序表

思路:遍历数组即可

代码:注意遍历的长度是useSize

// 打印顺序表
        public void display() {

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

        }

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

思路:遍历数组即可

代码:注意遍历的长度是useSize


public boolean isEmpty(){
            return useSize==0;
}

 public boolean contains(int toFind) {
        if (isEmpty()){
            return false;
        }

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

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

思路:遍历数组即可,找到返回下标

代码:注意遍历的长度是useSize

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

(5)获取 pos 位置的元素

思路:直接返回pos下标的数组

代码:

public int getPos(int pos) {
            if (pos<0||pos >=useSize){    
                throw new RuntimeException("当前下标不合法");  //手动抛出异常
            }
            if (isEmpty()){
                throw new RuntimeException("当前顺序表是空的");  //手动抛出异常
            }
            return this.elem[pos];
        }

(5)获取顺序表长度

思路:直接返回useSize 即可

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

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

思路:直接赋值即可,需要注意下标合法性

public void setPos(int pos, int value) {
                if(pos<0 || pos>= this.useSize){
                    System.out.println("pos不合法");
                }
                if(isEmpty()){
                    System.out.println("顺序表");
                }
                this.elem[pos] =value;
        
        }

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

思路:代码和add 有点像,大概原理是找到要删除的元素,然后让下一个元素到当前的元素上面就可以了,最后useSize--;

图片演示:
在这里插入图片描述

代码:

 //删除第一次出现的关键字key
        public void remove(int toRemove) {
        
            if (isEmpty()){  //判断是否为空
                return;
            }
            int index =search(toRemove);  //找到要删除的下标
            if (index==-1){
                return;
            }

            for (int i = index; i <useSize-1; i++) {
                elem[i] = elem[i+1];   //让后面的一个值来前面覆盖
            }
            useSize--;   //有效数 --
        }

思考一个问题为什么要 useSize-1
因为下面的是i+1,如果i走到了 最后一个格子,你在 elem[i] = elem[i+1]; 会 报一个空指针异常:
在这里插入图片描述


(7)清空顺序表

思路:遍历让每一个元素都变成0,最后useSize等于0;
代码:

 public void clear() {
            for (int i = 0; i <useSize; i++) {
                 this.elem[i]=0;
            }
            useSize=0;
        }

相关文章
|
15天前
|
Java 调度 Android开发
Android经典实战之Kotlin的delay函数和Java中的Thread.sleep有什么不同?
本文介绍了 Kotlin 中的 `delay` 函数与 Java 中 `Thread.sleep` 方法的区别。两者均可暂停代码执行,但 `delay` 适用于协程,非阻塞且高效;`Thread.sleep` 则阻塞当前线程。理解这些差异有助于提高程序效率与可读性。
39 1
|
2月前
|
存储 Java 编译器
Java中ArrayList的常用函数
确切地说,`ArrayList` 提供的这些方法构成了一套强大并且灵活的工具集,可以满足各种程序设计情况中的需求。例如,通过使用 `iterator()`方法,开发者可以在不知道集合大小的情况下遍历集合中全部或部分元素;而 `sort()`方法则能够对集合中的元素进行排序。这些函数在日常的Java编程中极其常见且重要,掌握它们对于进行集合操作和数据处理来说是基础且必须的。
21 2
Java中ArrayList的常用函数
|
14天前
|
存储 运维 Java
函数计算产品使用问题之怎么配置定时触发器来调用Java函数
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
15天前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
11 0
|
16天前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
22 0
|
2月前
|
Rust Cloud Native Java
Java演进问题之Serverless应用或函数的冷启动如何解决
Java演进问题之Serverless应用或函数的冷启动如何解决
|
3月前
|
存储 算法 搜索推荐
Java中的数组函数库及其使用技巧
Java中的数组函数库及其使用技巧
|
2月前
|
存储 Java Unix
(八)Java网络编程之IO模型篇-内核Select、Poll、Epoll多路复用函数源码深度历险!
select/poll、epoll这些词汇相信诸位都不陌生,因为在Redis/Nginx/Netty等一些高性能技术栈的底层原理中,大家应该都见过它们的身影,接下来重点讲解这块内容。
|
2月前
|
Java 测试技术
在Java中使用断言函数进行代码测试
在Java中使用断言函数进行代码测试
|
3月前
|
存储 Java 索引
Java中ArrayList(顺序表)的自我实现(如果想知道Java中怎么自我实现ArrayList,那么只看这一篇就足够了!)
Java中ArrayList(顺序表)的自我实现(如果想知道Java中怎么自我实现ArrayList,那么只看这一篇就足够了!)