前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【数据结构】ArrayList与顺序表

【数据结构】ArrayList与顺序表

作者头像
xxxflower
发布2023-04-16 17:43:39
1640
发布2023-04-16 17:43:39
举报
文章被收录于专栏:《数据结构》《数据结构》

1.线性表

线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列... 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

2.1接口的实现

我们先自己来完成一个顺序表8:

?具体效果如图:

源码如下:

建议小伙伴们自己思考一下上手敲一敲代码,对后续的学习可以更好的理解哟~

MyArrayList.java

代码语言:javascript
复制
import javax.xml.bind.annotation.XmlType;
import java.lang.reflect.Array;
import java.util.Arrays;

public class MyArratList {
    public int[] elem;
    public int usedSize;
    public static final int DEFAULT_SIZE = 10;

    public MyArratList(){
        this.elem = new int[DEFAULT_SIZE];
    }
    //打印数组
    public void display(){
        for (int i = 0; i < this.usedSize; i++) {
            System.out.print(elem[i]+" ");
        }
        System.out.println();
    }
    //新增元素,默认在素组最后新增
    public void add(int data) {
    //1.判断是不是满了
        if(isFull()){
            // 2.如果满了,要扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        //3.增加数据
           this.elem[this.usedSize] = data;
        //4.useSize++
        usedSize++;
    }
    public int size() {
        return this.usedSize;
    }
    public boolean isFull(){
        if(size() >= this.elem.length ){
            return true;
        }
        return false;
    }


    // 在 pos 位置新增元素
    //如果pos位置不合法,那么就会抛出一个PosWronfulExpection
    public void add(int pos, int data) throws PosWronfulExpection{

        if(isFull()){
            System.out.println("满了!");
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }

        if(pos < 0 || pos > this.usedSize){
            System.out.println("pos位置不合法!");
            throw new PosWronfulExpection("pos位置不合法!");
        }

        //pos合法
        //1.开始挪动数据
        for (int i = usedSize-1; i >= pos; i--) {
            this.elem[i+1] = this.elem[i];
        }
        //2.插入数据
        this.elem[pos] = data;
        //3.useSize++
        usedSize++;
    }

    // 判定是否包含某个元素
    public boolean contains(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(toFind == this.elem[i]){
                return true;
            }
        }
        return false;
    }
    // 查找某个元素对应的位置
    public int indexOf(int toFind) {
        for (int i = 0; i < usedSize; i++) {
            if(toFind == elem[i]){
                return i;
            }
        }
        return -1;
    }
    // 获取 pos 位置的元素
    public int get(int pos) {
       if(isEmpty()){
           throw new EmptyExpection("当前顺序表为空!");
       }
       if(pos < 0||pos >=this.usedSize){
           throw new PosWronfulExpection("pos不合法!");
       }
        return elem[pos];
    }
    public boolean isEmpty(){
        return size()== 0;
    }

    // 给 pos 位置的元素设为 value
    public void set(int pos, int value) {
        if(isEmpty()){
            throw new EmptyExpection("当前顺序表为空!!");
        }
        if(pos < 0||pos >=this.usedSize){
            throw new PosWronfulExpection("pos位置不合法!!!");
        }
        this.elem[pos] = value;
    }
    //删除第一次出现的关键字key
    public void remove(int key) {
        if(isEmpty()){
            throw new EmptyExpection("当前顺序表为空!");
        }
       int index = this.indexOf(key);
        if(index == -1){
            System.out.println("没有这个数字!");
        }
        for (int i = index; i < this.usedSize-1; i++) {
            this.elem[i] = this.elem[i+1];
        }

        usedSize--;
    }
    // 获取顺序表长度
    // 清空顺序表
    public void clear() {
       /* //当变量是引用类型时:
        for (int i = 0; i < size(); i++) {
            this.elem = null;
        }*/
        this.usedSize = 0;
    }
}

?EmptyExpection.java

代码语言:javascript
复制
public class EmptyExpection extends RuntimeException{
    public EmptyExpection() {

    }
    public EmptyExpection(String message) {
        super(message);
    }
}

?PosWronfulExpection.java

代码语言:javascript
复制
public class PosWronfulExpection extends RuntimeException{
    public PosWronfulExpection(){

    }
    public PosWronfulExpection(String message){
        super(message);
    }
}

?TestList.java

代码语言:javascript
复制
import com.sun.xml.internal.bind.v2.TODO;

public class TestList {
    public static void main(String[] args) {
        MyArratList myArratList = new MyArratList();
        myArratList.add(1);
        myArratList.add(2);
        myArratList.add(3);
        myArratList.display();
        try {
            myArratList.add(1,10);
        }catch (PosWronfulExpection e){
            e.printStackTrace();
        }
        myArratList.display();
        //trycatch的快捷键!!
        System.out.println(myArratList.contains(10));
        System.out.println(myArratList.contains(100));
        System.out.println(myArratList.indexOf(10));
        System.out.println(myArratList.indexOf(100));
        try{
            System.out.println(myArratList.get(1));
        }catch (PosWronfulExpection e){
            e.printStackTrace();
        }
        System.out.println("-------------------------------------");
        myArratList.set(0,99);
        myArratList.display();
    }
}

3. ArrayList简介

在集合框架中,ArrayList是一个普通的类,实现了List接口.如图:

?【说明】 1. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问 2. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的 3. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的 4. 和Vector不同,ArrayList不是线程安全的,在单线程下可以使用,在多线程中可以选择Vector或者CopyOnWriteArrayList 5. ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表

4.ArrayList使用

4.1 ArrayList的构造

方法

解释

ArrayList()

无参构造

ArrayList(Collection<? extends E> c)

利用其他 Collection 构建 ArrayList

ArrayList(int initialCapacity)

指定顺序表初始容量

4.2ArraysList常见操作

详情可以去帮助手册中查找:

方法

解释

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

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.线性表
  • 2.顺序表
    • 2.1接口的实现
    • 3. ArrayList简介
    • 4.ArrayList使用
      • 4.1 ArrayList的构造
        • 4.2ArraysList常见操作
        相关产品与服务
        对象存储
        对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
        http://www.vxiaotou.com