java数据结构基础:线性表
目录
- 前言
- 需求分析
- 编码
- add方法
- getIndex方法
- pop方法
- insert方法
- getAll
- 全部代码
- 总结
前言 其实线性表在生活中和栈的结构差不多。昨天总结了一篇单链表,也是线性表的一种。
今天用另一种写法来控制指针的移动实现数据的顺序存储结构。
需求分析 首先要明确,这种顺序存储结构的线性表底层用什么。根据之前查看过的源码来看,list一般都是以数组为底层。我们也不例外。
其次,我们还得去定义好线性表的长度,以及每个元素的指针。
private Object[] arr; // 底层的结构private int index = -1; // 代表元素的索引位置private int size; // 当前线性表的长度private int LinearListLength = 4; // 线性表的默认长度
我们这儿只演示添加、删除、获取指定位置、获取全部以及判断是否为空这五种形式。
编码
add方法
add方法为向线性表中添加元素,需要传入一个泛型参数。实现思路是让index+1然后把index赋值给数组得到索引区域,再让size+1
【java数据结构基础:线性表】总体设计比较简单,看代码。
public E add(E item) {// 先初始化线性表capacity(); // 初始化完成后先把index指针后移一位,也就是+1// 后移一位之后将要添加的元素赋值到数组中this.arr[++index] = item; System.out.println(index); // 添加完成后长度+1this.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{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); // 添加完成后长度+1this.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/2this.arr = Arrays.copyOf(this.arr, this.LinearListLength); // 复制一个新的数组,用新开辟的长度}}public static void main(String[] args) {MyLinearList 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(); }}
总结 本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注脚本之家的更多内容!
推荐阅读
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 事件代理
- Java|Java OpenCV图像处理之SIFT角点检测详解
- java中如何实现重建二叉树
- 数组常用方法一
- Python基础|Python基础 - 练习1
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- Java|Java基础——数组
- RxJava|RxJava 在Android项目中的使用(一)
- java之static、static|java之static、static final、final的区别与应用