【数据结构】模拟实现顺序表

ArrayList的概念

ArrayList是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般是用数组完成的。ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表 。

ArrayList初始化

java 复制代码
public class MyArrayList {
    private int[] elem;
    //顺序表实际的长度
    private int usedSize;
    private static final int DEFAULT_SIZE = 10;

    //默认初始化大小为10
    public MyArrayList() {
        this.elem = new int[DEFAULT_SIZE];
    }

    // 自己指定顺序表的底层容量设置为initCapacity
    MyArrayList(int initCapacity) {
        this.elem = new int[initCapacity];
    }
}

以下是ArrayList的常见方法

java 复制代码
// 新增元素,默认在数组最后新增
public void add(int data)
// 在 pos 位置新增元素
public void add(int pos, int data)
// 判定是否包含某个元素
public boolean contains(int toFind)
// 查找某个元素对应的位置
public int indexOf(int toFind)
// 获取 pos 位置的元素
public int get(int pos)
// 给 pos 位置的元素设为 value
public void set(int pos, int value)
//删除第一次出现的关键字key
public void remove(int toRemove)
// 获取顺序表长度
public int size()
// 清空顺序表
public void clear()

在实现这些方法之前我们先来写一个判断数组是否装满的方法来判断顺序表是否装满

java 复制代码
//判断数组是否装满
public boolean isFull() {
	return this.elem.length == usedSize;
}

实现add方法( 默认在数组最后新增元素)

java 复制代码
public void add(int data) {
	//判断顺序表是否装满 满了我们就需要扩容
    if (isFull()) {
    	//扩容为原来的两倍  ArrayList底层是1.5倍扩容
        this.elem = Arrays.copyOf(this.elem, this.elem.length * 2);
    }
    //把元素存到数组里
    this.elem[usedSize] = data;
    //数组长度+1
    this.usedSize++;
}

实现add方法(在指定位置新增元素)

因为指定的位置有可能不合法,不在数组长度范围内我们可以写一个方法来判断位置是否合法,不合法我们可以自定义一个异常

java 复制代码
public class PosOutOfBoundsException extends RuntimeException {
    public PosOutOfBoundsException() {
	}

	public PosOutOfBoundsException(String message) {
		super(message);
    }
}
java 复制代码
public void check(int pos) {
    //如果pos小于0或大于数组的实际长度我们就认为它不合法
	if (pos < 0 || pos > this.usedSize) {
		throw new PosOutOfBoundsException("pos不合法 " + pos);
	}
}
java 复制代码
public void add(int pos, int data) {
    //检查pos是否合法
	check(pos);
    //判断数组元素是否已满
	if (isFull()) {
		//扩容
		this.elem = Arrays.copyOf(this.elem, this.elem.length * 2);
	}
	//把元素向后移动
	for (int i = this.usedSize - 1; i >= pos; i--) {
		elem[i + 1] = elem[i];
	}
	//插入元素
	elem[pos] = data;
	this.usedSize++;
}

实现contains方法(判定是否包含某个元素)

java 复制代码
public boolean contains(int toFind) {
	for (int i = 0; i < this.usedSize; i++) {
		if (this.elem[i] == toFind) {
			return true;
		}
	}
	return false;
}

实现indexOf方法(查找某个元素对应的位置)

java 复制代码
public int indexOf(int toFind) {
	for (int i = 0; i < this.usedSize; i++) {
		if (this.elem[i] == toFind) {
			return i;
		}
	}
	return -1;
}

实现get方法(获取某个位置的元素)

获取元素之前我们应该先判断一下要获取的位置是否合法

java 复制代码
public int get(int pos) {
	check(pos);
	return this.elem[pos];
}

实现set方法(把某个位置的元素设置成value)

和get方法一样我们应该先判断位置是否合法

java 复制代码
public void set(int pos, int value) {
	check(pos);
	this.elem[pos] = value;
}

实现remove方法(删除第一次出现的元素)

在删除元素之前我们应该先确认要删除的元素是否在数组中,如果在就删除

java 复制代码
public void remove(int toRemove) {
    //判断要删除的toRemove是否在数组中 在返回toRemove的下标 否则返回-1
	int index = indexOf(toRemove);
	if (index==-1) {
		System.out.println("没有找到 "+toRemove);
	}
	for (int i = index; i < this.usedSize-1; i++) {
		this.elem[i] = this.elem[i+1];
	}
	this.usedSize--;
}

实现size方法(获取顺序表的长度)

要获取长度很简单,我们只需要知道usedSize的大小就行了,因为usedSize就是顺序表的实际长度

java 复制代码
public int size() {
	return this.usedSize;
}

实现clear方法(清空顺序表)

同样的清空顺序表我们只需要把usedSize的大小改成0就可以了

java 复制代码
public void clear() {
//如果是引用数据类型
// for (int i = 0; i < this.usedSize; i++) {
//      this.elem[i] = null;
// }
	this.usedSize = 0;
}
相关推荐
Edward111111113 分钟前
tomcat_servlet
java·servlet·tomcat
短剑重铸之日14 分钟前
SpringBoot声明式事务的源码解析
java·后端·spring·springboot
李白的粉17 分钟前
基于springboot的银行客户管理系统(全套)
java·spring boot·毕业设计·课程设计·源代码·银行客户管理系统
JIngJaneIL20 分钟前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
长安er26 分钟前
LeetCode 20/155/394/739/84/42/单调栈核心原理与经典题型全解析
数据结构·算法·leetcode·动态规划·
努力的小南35 分钟前
Java字节码文件常量池索引两个问题
java·常量池·字节码文件·黑马jvm字节码文件常量池索引
期待のcode40 分钟前
Java的抽象类和接口
java·开发语言
while(1){yan}43 分钟前
SpringDI
java·jvm·spring·java-ee
陈平安安1 小时前
设计一个秒杀功能
java·数据库·sql
TAEHENGV1 小时前
基本设置模块 Cordova 与 OpenHarmony 混合开发实战
android·java·数据库