java数据结构基础:线性表

 更新时间:2021年07月27日 15:25:25   作者:鱼小洲  
这篇文章主要介绍了Java的数据解构基础,希望对广大的程序爱好者有所帮助,同时祝大家有一个好成绩,需要的朋友可以参考下,希望能给你带来帮助

前言

其实线性表在生活中和栈的结构差不多。昨天总结了一篇单链表,也是线性表的一种。

今天用另一种写法来控制指针的移动实现数据的顺序存储结构。

需求分析

首先要明确,这种顺序存储结构的线性表底层用什么。根据之前查看过的源码来看,list一般都是以数组为底层。我们也不例外。

其次,我们还得去定义好线性表的长度,以及每个元素的指针。

private Object[] arr; // 底层的结构
private int index = -1; // 代表元素的索引位置
private int size; // 当前线性表的长度
private int LinearListLength = 4; // 线性表的默认长度

我们这儿只演示添加、删除、获取指定位置、获取全部以及判断是否为空这五种形式。

编码

add方法

add方法为向线性表中添加元素,需要传入一个泛型参数。实现思路是让index+1然后把index赋值给数组得到索引区域,再让size+1

总体设计比较简单,看代码。

public E add(E item) {
        // 先初始化线性表
        capacity();
        // 初始化完成后先把index指针后移一位,也就是+1
        // 后移一位之后将要添加的元素赋值到数组中
        this.arr[++index] = item;
        System.out.println(index);
        // 添加完成后长度+1
        this.size++;
        return item;
    }

getIndex方法

getIndex方法主要是用来获取指定位置的元素,这个就很简单了,因为底层是数组,所以我们可以直接用数组的索引去获取。

public E getIndex(int index) {
        return (E) this.arr[index];
    }

pop方法

pop方法作用是删除指定位置的元素。需要传入一个int类型的索引。由于特殊性,我们必须得借用上面的获取指定位置的元素的方法来实现这一步骤。

在元素删除后,通过遍历循环去将index位置向前移动一位。具体代码如下:

/**
 * 删除指定位置的元素
 */
public E pop(int index) {
    E e = getIndex(index);
    if (e != null) {
        for (int i = index; i < size; i++) {
            arr[i] = arr[i + 1];
        }
        this.size--;
        return e;
    } else {
        return null;
    }
}

insert方法

insert方法需要传入两个参数,一个int类型的索引值,一个泛型数据。在指定位置插入该泛型值,然后将后面的值全部后移一位。

public E insert(int index, E item) {
        System.out.println(size);
        for (int i = index; i < size; i++) {
            arr[i + 1] = arr[i];
        }
        arr[index] = item;
        this.size++;
        return item;
    }

getAll

这个方法不用我多说了,一个简单的遍历循环

public void getAll() {
        for (Object o : this.arr) {
            System.out.println(o);
        }
    }

这儿遍历的Object类型会自动转化成添加元素时的类型

全部代码

package com.zxy.xianxingbiao;
/**
 * @Author Zxy
 * @Date 2021/2/4 16:54
 * @Version 1.0
 */
import java.util.Arrays;
/**
 * 演示线性表的使用  底层使用数组
 */
public class MyLinearList<E> {
    private Object[] arr; // 底层的结构
    private int index = -1; // 代表元素的索引位置
    private int size; // 当前线性表的长度
    private int LinearListLength = 4; // 线性表的默认长度
    /**
     * 判断线性表是否为空
     */
    public boolean empty() {
        return this.size == 0 ? true : false;
    }
    /**
     * 给线性表中添加元素
     */
    public E add(E item) {
        // 先初始化线性表
        capacity();
        // 初始化完成后先把index指针后移一位,也就是+1
        // 后移一位之后将要添加的元素赋值到数组中
        this.arr[++index] = item;
        System.out.println(index);
        // 添加完成后长度+1
        this.size++;
        return item;
    }
    /**
     * 在指定位置插入元素
     */
    public E insert(int index, E item) {
        System.out.println(size);
        for (int i = index; i < size; i++) {
            arr[i + 1] = arr[i];
        }
        arr[index] = item;
        this.size++;
        return item;
    }
    /**
     * 获取指定位置的元素
     */
    public E getIndex(int index) {
        return (E) this.arr[index];
    }
    /**
     * 删除指定位置的元素
     */
    public E pop(int index) {
        E e = getIndex(index);
        if (e != null) {
            for (int i = index; i < size; i++) {
                arr[i] = arr[i + 1];
            }
            this.size--;
            return e;
        } else {
            return null;
        }
    }
    /**
     * 获取全部的元素
     */
    public void getAll() {
        for (Object o : this.arr) {
            System.out.println(o);
        }
    }
    /**
     * 数组初始化或者以1.5倍容量对数组扩容
     */
    private void capacity() {
        // 数组初始化
        if (this.arr == null) {
            this.arr = new Object[this.LinearListLength];
        }
        // 以1.5倍对数组扩容
        if (this.size - (this.LinearListLength - 1) >= 0) { // 如果当前数组的元素个数大于了当前数组的最后一个索引值
            this.LinearListLength = this.LinearListLength + (this.LinearListLength >> 1); // 位运算,让长度变成原来的1/2
            this.arr = Arrays.copyOf(this.arr, this.LinearListLength); // 复制一个新的数组,用新开辟的长度
        }
    }
    public static void main(String[] args) {
        MyLinearList<String> list = new MyLinearList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        System.out.println(list.getIndex(1));
        list.pop(1);
        System.out.println(list.getIndex(1));
        list.getAll();
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • 关于maven:pom文件的使用解析

    关于maven:pom文件的使用解析

    这篇文章主要介绍了关于maven:pom文件的使用说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • logback配置中变量和include的应用方式

    logback配置中变量和include的应用方式

    这篇文章主要介绍了logback配置中变量和include的应用方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • SpringDataRedis简单使用示例代码

    SpringDataRedis简单使用示例代码

    这篇文章主要介绍了SpringDataRedis简单使用,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-02-02
  • maven deploy时报错的解决方法

    maven deploy时报错的解决方法

    这篇文章主要介绍了maven deploy时报错的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • SpringBoot启动时加载指定方法的方式小结

    SpringBoot启动时加载指定方法的方式小结

    本文主要给大家介绍了Spring Boot项目启动时加载指定方法都有哪些方式的,文中给大家介绍了五种常用的方式,有详细的代码示例,具有一定的参考价值,需要的朋友可以参考下
    2023-08-08
  • Java Builder模式构建MAP/LIST的实例讲解

    Java Builder模式构建MAP/LIST的实例讲解

    下面小编就为大家带来一篇Java Builder模式构建MAP/LIST的实例讲解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • SpringBoot2.x 参数校验问题小结

    SpringBoot2.x 参数校验问题小结

    这篇文章主要介绍了SpringBoot2.x 参数校验一些问题总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 如何基于java语言实现八皇后问题

    如何基于java语言实现八皇后问题

    这篇文章主要介绍了如何基于java语言实现八皇后问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • 在springboot 中使用 AIService的方法

    在springboot 中使用 AIService的方法

    这篇文章主要介绍了在springboot 中使用 AIService的方法,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧
    2025-04-04
  • 使用spring aop统一处理异常和打印日志方式

    使用spring aop统一处理异常和打印日志方式

    这篇文章主要介绍了使用spring aop统一处理异常和打印日志方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论