Java实现顺序表

为了规范功能,我们创建一个接口来规定顺序表要实现的功能。

IList.java

java 复制代码
public interface IList {

    // 在顺序表末尾添加元素
    public void add(int data);

    // 在指定位置 pos 插入元素 data
    public void add(int pos, int data);

    // 判断顺序表中是否包含指定元素
    public boolean contains(int toFind);

    // 查找元素第一次出现的位置,找不到返回 -1
    public int indexOf(int toFind);

    // 获取 pos 位置的元素
    public int get(int pos);

    // 修改 pos 位置的元素为 value
    public void set(int pos, int value);

    // 删除第一次出现的 toRemove 元素
    public void remove(int toRemove);

    // 返回顺序表中有效元素个数
    public int size();

    // 清空顺序表
    public void clear();

    // 打印顺序表中所有元素
    public void display();

    // 判断顺序表是否已满
    boolean isFull();

    // 判断顺序表是否为空
    public boolean isEmpty();
}

之后我们来实现这些功能。

add(int data)很简单,在末尾添加元素就行,注意不要忘记usedSize++,还有要先检查表中数据是否满了,如果满了要扩容。

add(int pos, int data)要先判断pos是否合法,之后把pos及以后的数向后挪,首先也要检查表是否满。挪后在pos位置插入data,并让usedSize++。

contains(int toFind)先判断表是否为空,不为空循环在表中找就行了。

indexOf(int toFind)判断表是否为空,不为空循环在表中找。

get(int pos)判断pos是否合法,合法了再寻找元素。

set(int pos, int value)判断pos是否合法,如果合法再修改该元素位置。

remove(int toRemove)判断表是否为空,不为空循环在表中找。

size()返回usedSize即可。

clear()顺序表置0即可。

display()循环打印即可。

isFull()判断表的usedSized是否等于表的长度。

当然为了实现时方便,我还增加了这些。

checkPosOnAdd(int pos)判断插入pos是否在0-usedSized之间。

checkCapacity判断空间是否足够,不够的话扩容。

checkPosOnGetSet判断获取pos是否合法。

MyArrayList.java

java 复制代码
import java.util.Arrays;
public class MyArrayList implements IList{
    public int[] elem;
    public int usedSize;
    public static final int DEFAULT_SIZE=10;

    public MyArrayList(){
        this.elem=new int[DEFAULT_SIZE];
    }
    public MyArrayList(int capacity){
        this.elem=new int[capacity];
    }
    @Override
    public void add(int data) {
        checkCapacity();
        this.elem[this.usedSize++]=data;
    }

    @Override
    public void add(int pos, int data) {
        try{
            checkPosOnAdd(pos);
        }catch(PosIllegality e){
            e.printStackTrace();
            return;
        }
        checkCapacity();
        for(int i=usedSize-1;i>=pos;i--){
            elem[i+1]=elem[i];
        }
        elem[pos]=data;
        usedSize++;
    }

    private void checkPosOnAdd(int pos) throws PosIllegality{
        if(pos<0||pos>usedSize){
            System.out.println("不合法!");
            throw new PosIllegality("插入元素下标异常:"+pos);
        }
    }

    private void checkCapacity(){
        if(isFull()){
            elem= Arrays.copyOf(elem,elem.length*2);
        }
    }

    @Override
    public boolean contains(int toFind) {
        if(isEmpty())
        return false;
        for(int i=0;i<usedSize;i++){
            if(elem[i]==toFind)
                return true;
        }
        return false;
    }

    @Override
    public int indexOf(int toFind) {
        if(isEmpty())
            return -1;
        for(int i=0;i<usedSize;i++){
            if(elem[i]==toFind)
                return i;
        }
        return -1;
    }

    @Override
    public int get(int pos) {
        checkPosOnGetSet(pos);
        if(isEmpty())
        {
            throw new MyArrayListEmpty("获取指定下标元素时" + "顺序表为空!");
        }
        return elem[pos];
    }

    private void checkPosOnGetSet(int pos) throws PosIllegality{
        if(pos<0||pos>=usedSize){
            System.out.println("不合法!");
            throw new PosIllegality("获取指定下标的元素异常:"+pos);
        }
    }

    @Override
    public void set(int pos, int value) {
    checkPosOnGetSet(pos);
    elem[pos]=value;
    }

    @Override
    public void remove(int toRemove) {
        int index=indexOf(toRemove);
        if(index==-1){
            System.out.println("不存在");
            return;
        }
        for(int i=index;i<usedSize-1;i++){
            elem[i]=elem[i+1];
        }
        usedSize--;
    }

    @Override
    public int size() {
        return this.usedSize;
    }

    @Override
    public void clear() {
        this.usedSize=0;
    }

    @Override
    public void display() {
        for(int i=0;i<this.usedSize;i++){
            System.out.print(this.elem[i]+" ");
        }
        System.out.println();
    }

    @Override
    public boolean isFull() {
        return usedSize==elem.length;
    }

    @Override
    public boolean isEmpty() {
        return usedSize==0;
    }
}

`try...catch` 用来 捕获并处理异常,防止程序因为错误直接崩溃。

为了防止顺序表为空还要删除、获取元素这种情况,我自定义了一个异常,代码如下。

MyArrayListEmpty.java

java 复制代码
public class MyArrayListEmpty extends RuntimeException{
    public MyArrayListEmpty(String msg){
        super(msg);
    }
}

继承 `RuntimeException`,属于运行时异常。

为了当数组下标越界、位置不合法时抛出异常,还定义了一个异常,代码如下。

PosIllegality .java

java 复制代码
public class PosIllegality extends RuntimeException{
    public PosIllegality(String msg){
        super(msg);
    }
}

测试代码如下。

Test.java

java 复制代码
public class Test {
    public static void main(String[] args) {
        MyArrayList myArrayList =new MyArrayList();
        myArrayList.add(1);
        myArrayList.add(2);
        myArrayList.add(3);
        myArrayList.display();

        myArrayList.add(3,99);
        myArrayList.display();

        myArrayList.set(3,888);
        myArrayList.display();

        myArrayList.remove(1);
        myArrayList.display();

    }
}
相关推荐
学长毕设8 小时前
基于SpringBoot的实验室资产管理系统
java·spring boot·后端
zzu123zsw10 小时前
从臃肿的模板调用到声明式契约:深入 UniHttp 动态代理与多渠道生命周期扩展
java·spring boot·microsoft·unihttp
UIU11410 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
源码集结号11 小时前
云诊所门诊系统源码,基于SpringBoot+Vue.js架构,支持多租户设计与Docker容器化部署
java·spring boot·源码·医院信息系统·门诊系统·诊所系统
论文复现现场11 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi11 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
啃瓜子的松鼠11 小时前
泛微OAe9-后端二开异步调用
java
秋天的怀念_David12 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法
外收内放12 小时前
Python基础语法练习题(73)
java·前端·python
Wang's Blog12 小时前
Java 项目实战: 交友项目 - 环信后台发送消息测试
java·交友