JAVASE->数据结构|顺序表底层逻辑


✅作者简介:大家好,我是橘橙黄又青,一个想要与大家共同进步的男人😉😉

🍎个人主页再无B~U~G-CSDN博客
目标:

  1. 什么是 List
  2. List 常见接口介绍
  3. List 的使用
    本章主要学习顺序表底层逻辑,大致是一样的,不差多少。

1.什么是List

在集合框架中,List是一个接口,继承自Collection

Collection****也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:


Iterable 也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:

List 的官方文档
站在数据结构的角度来看, List 就是一个线性表,即 n 个具有相同类型元素的有限序列,在该序列上可以执行增删 改查以及变量等操作
面试题 】 Collection 中有那些方法?

**2.**常见接口介绍

List中提供了好的方法,具体如下:


虽然方法比较多,但是常用方法如下:

|------------------------------------------------|---------------------------|
| 方法 | 解释 |
| boolean add (E e) | 尾插 e |
| void add (int index, E element) | 将 e 插入到 index 位置 |
| boolean addAll (Collection<? extends E> c) | 尾插 c 中的元素 |
| E remove (int index) | 删除 index 位置元素 |
| boolean remove (Object o) | 删除遇到的第一个 o |
| E get (int index) | 获取下标 index 位置元素 |
| E set (int index, E element) | 将下标 index 位置元素设置为 element |
| void clear () | 清空 |
| boolean contains (Object o) | 判断 o 是否在线性表中 |
| int indexOf (Object o) | 返回第一个 o 所在下标 |
| int lastIndexOf (Object o) | 返回最后一个 o 的下标 |
| List<E> subList (int fromIndex, int toIndex) | 截取部分 list |

3.简单实现List顺序表的底层逻辑

目的:为了更加清楚的了解顺序表的使用

相应的级别关系:

把所有的顺序表方法都定义在IList接口:

这里不带多讲,结构上跟c语言差不多。

我们说一下异常这一块:

梳理一下异常的应用,比如说:

实现代码:

相应的解释代码里面都有:

src/arrayList/IList接口

java 复制代码
package arrayList;

public interface IList {
    // 新增元素,默认在数组最后新增
    void add(int data);

    // 在 pos 位置新增元素
    void add(int pos, int data);

    // 判定是否包含某个元素
    boolean contains(int toFind);

    // 查找某个元素对应的位置
    int indexOf(int toFind);

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

    // 给 pos 位置的元素设为 value -> 更新
    void set(int pos, int value);

    //删除第一次出现的关键字key
    void remove(int toRemove);

    // 获取顺序表长度
    int size();

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

    // 打印顺序表,
    // 注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    void display();
}

src/arrayList/MyArrayList类

java 复制代码
package arrayList;

import java.util.Arrays;

public class MyArrayList implements IList {

    public int[] elem;
    public int usedSize;

    //调用构造方法,初始化顺序表长度
    public MyArrayList() {
        this.elem = new int[2];
    }
    //判断顺序表满不满
    public boolean isFull() {
        return elem.length == usedSize;
    }

    //添加一个元素
    @Override
    public void add(int data) {
        if (isFull()) {
            elem = Arrays.copyOf(elem, 2 * elem.length);
        }
        this.elem[usedSize] = data;
        this.usedSize++;
    }


    //该方法来 判断 添加元素时 pos是否合法
    private void checkPosOfAdd(int pos) throws PosNotLegalException {
        if (pos < 0 || pos > usedSize) {
            throw new PosNotLegalException("pos位置不合法!");
        }
    }

    // 在 pos 下标位置新增元素
    @Override
    public void add(int pos, int data) {
        //判断是不是正确引用
        try {
            checkPosOfAdd(pos);
        } catch (PosNotLegalException e) {
            e.printStackTrace();
        }
        if (isFull()) {
            //扩容
            elem = Arrays.copyOf(elem, 2 * elem.length);
        }
        //移动元素
        for (int i = usedSize - 1; i >= pos; i--) {
            elem[i + 1] = elem[i];
        }
        //插入元素
        this.elem[pos] = data;
        this.usedSize++;
    }

    //判断顺序表是否有改元素
    @Override
    public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (this.elem[i] == toFind) {
                return true;
            }
        }
        return false;
    }

    //查找某个元素对应的下标位置
    @Override
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if (this.elem[i] == toFind) {
                return i;
            }
        }
        return -1;
    }

    //判断pos位置是否合法
    private void checkPosOfGetAndSet(int pos) throws PosNotLegalException{
        if(pos < 0 || pos >= usedSize) {
            throw new PosNotLegalException("get/set获取元素的时候" +
                    "pos位置不合法!");
        }
    }
    // 获取 pos 位置的元素
    @Override
    public int get(int pos) {
        //判断pos位置是否合法
        try {
            checkPosOfGetAndSet(pos);
        }catch (ClassCastException e){
            e.printStackTrace();
        }
        return this.elem[pos];
    }

    // 给 pos 位置的元素设为 value -> 更新
    @Override
    public void set(int pos, int value) {
        //判断pos位置是否合法
        try {
            checkPosOfGetAndSet(pos);
        }catch (ClassCastException e){
            e.printStackTrace();
        }
        this.elem[pos] = value;
    }

    //删除第一次出现的关键字key
    @Override
    public void remove(int toRemove) {
        //1、要查找是否存在要删除的关键字 toRemove
        int pos = indexOf(toRemove);
        if(pos == -1) {
            System.out.println("没有要删除的数字!");
            return;
        }
        for (int i = pos; i < usedSize-1; i++) {
            elem[i] = elem[i+1];
        }
        usedSize--;
    }

    //返回数据长度
    @Override
    public int size() {
        return this.usedSize;
    }

    //释放顺序表
    @Override
    public void clear() {
        this.elem = null;
        this.usedSize = 0;
    }
    //打印顺序表
    @Override
    public void display() {
        System.out.print("[ ");
        for (int i = 0; i < usedSize; i++) {
            System.out.print(elem[i] + " ");

        }
        System.out.println("]");
    }
}

src/arrayList/PosNotLegalException类

java 复制代码
package arrayList;

public class PosNotLegalException extends RuntimeException{
    //不带参数的构造方法
    public PosNotLegalException() {

    }
    //带参数的构造方法
    public PosNotLegalException(String msg) {
        super(msg);
    }

}

src/arrayList/Test测试类

java 复制代码
package arrayList;

public class Test {
    public static void main(String[] args) {
        MyArrayList list = new MyArrayList();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);

//        list.add(1,24);
//        boolean temp = list.contains(24);
//        if(temp){
//            System.out.println("有");
//        }else{
//            System.out.println("没有");
//        }
        // 打印链表
        list.display();
//        int is =list.indexOf(2);
//        if (is >= 0) {
//            System.out.println("有,在下标:" + is);
//        } else {
//            System.out.println("没有");
//        }

        // 获取 pos 位置的元素
//        int a = list.get(3);
//        System.out.println(a);
//        list.set(2, 6);
//        System.out.println(a);
        list.remove(3);
        // 打印链表
        list.display();

    }
}

今天就到这里了,感谢观看。

相关推荐
wheeldown7 小时前
【数据结构】选择排序
数据结构·算法·排序算法
躺不平的理查德11 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
阿洵Rain11 小时前
【C++】哈希
数据结构·c++·算法·list·哈希算法
Leo.yuan11 小时前
39页PDF | 华为数据架构建设交流材料(限免下载)
数据结构·华为
半夜不咋不困11 小时前
单链表OJ题(3):合并两个有序链表、链表分割、链表的回文结构
数据结构·链表
忘梓.12 小时前
排序的秘密(1)——排序简介以及插入排序
数据结构·c++·算法·排序算法
y_m_h15 小时前
leetcode912.排序数组的题解
数据结构·算法
1 9 J15 小时前
数据结构 C/C++(实验三:队列)
c语言·数据结构·c++·算法
921正在学习编程15 小时前
数据结构之二叉树前序,中序,后序习题分析(递归图)
c语言·数据结构·算法·二叉树
毕竟秋山澪15 小时前
岛屿数量 广搜版BFS C#
数据结构·算法·宽度优先