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

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;
}
相关推荐
励志的小陈1 小时前
数据结构--二叉树知识讲解
数据结构
chools1 小时前
【AI超级智能体】快速搞懂工具调用Tool Calling 和 MCP协议
java·人工智能·学习·ai
李白你好2 小时前
TongWeb EJB 反序列化生成工具(Java-Chain 插件)
java·安全
笨笨饿2 小时前
#58_万能函数的构造方法:ReLU函数
数据结构·人工智能·stm32·单片机·硬件工程·学习方法
U盘失踪了3 小时前
Java 的 JAR 是什么?
java·jar
今天又在写代码3 小时前
java-v2
java·开发语言
competes4 小时前
慈善基金投资底层逻辑应用 顶层代码低代码配置平台开发结构方式数据存储模块
java·开发语言·数据库·windows·sql
2501_913061344 小时前
网络原理知识
java·网络
希望永不加班5 小时前
Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别
java·开发语言·后端·spring·代理模式
flushmeteor5 小时前
java的动态代理和字节码生成技术
java·动态代理·代理·字节码生成