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

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;
}
相关推荐
秋意钟3 分钟前
Spring新版本
java·后端·spring
椰椰椰耶5 分钟前
【文档搜索引擎】缓冲区优化和索引模块小结
java·spring·搜索引擎
mubeibeinv7 分钟前
项目搭建+图片(添加+图片)
java·服务器·前端
青莳吖8 分钟前
Java通过Map实现与SQL中的group by相同的逻辑
java·开发语言·sql
Buleall15 分钟前
期末考学C
java·开发语言
重生之绝世牛码17 分钟前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式
小蜗牛慢慢爬行23 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
用户00993831430139 分钟前
代码随想录算法训练营第十三天 | 二叉树part01
数据结构·算法
shinelord明42 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
新手小袁_J1 小时前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11