顺序表(ArrayList)

news2025/2/5 8:43:03

1、简介

        顺序表是用一段物理地址连续 的存储单元依次存储数据元素的线性结构,一般情况下 采用数组存储 。在 数组 上完成数据的增删查改。( 顺序表的底层结构是一个数组

2、顺序表的实现

       下面是顺序表的一些基本成员和方法,能够让大家更好的认识和了解顺序表:

1、组成成员和构造方法

    private int[] elem;//用来存放数据元素
    private int usedSized;//用来计算有效数据元素的个数
    public final static int DEFUALT_SIZE = 10;
    //无参构造方法,初始化默认长度的顺序表
    public MyArrayList() {
        this.elem = new int[DEFUALT_SIZE];
    }
    // 将顺序表的底层容量设置为initcapacity
    public MyArrayList(int initcapacity ) {
        this.elem = new int[initcapacity];
    }

2、新增元素(默认在数组最后新增)

//新增元素  默认在最后添加
    public boolean isFull(){
        if(this.elem.length==this.usedSized){
            return true;
        }
        return false;
    }
    public void add(int data) {
        //如果满了,则要进行扩容
        if(isFull()){
            //扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        this.elem[this.usedSized] = data;
        this.usedSized++;
    }

 3、在pos位置新增元素

//在pos位置新增元素
 public void add(int pos, int data) {
        if(pos < 0||pos > usedSized){
            throw new PosOutOfBoundsException(pos+"下标位置不合法");
        }
        //如果满了,则要进行扩容
        if(isFull()){
            //扩容
            this.elem = Arrays.copyOf(this.elem,2*this.elem.length);
        }
        for (int i = this.usedSized - 1; i >= pos ; i--) {//这里pos位置的数据也需要往后挪
            this.elem[i+1] = this.elem[i];
        }
        this.elem[pos] = data;
        this.usedSized++;
    }

自定义异常的代码 :

public class PosOutOfBoundsException extends RuntimeException {
    public PosOutOfBoundsException(String message) {
        super(message);
    }
}

4、判定是否包含某个元素

//判定是否包含某个元素
public boolean contains(int toFind) {
        for (int i = 0; i < this.usedSized; i++) {
            if(this.elem[i] == toFind){
                return true;
            }
        }
        return false;
    }

5、查找某个元素对应的位置

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

6、获取pos位置的元素

//判断pos位置是否合法
    private void checkPos(int pos){
        if(pos < 0 ||pos >= this.usedSized){
            throw new PosOutOfBoundsException(pos+"下标位置不合法");
        }
    }
//获取pos位置的元素
public int get(int pos) {
        checkPos(pos);
        return this.elem[pos];
    }

 7、给 pos 位置的元素设为 value(更新)

//给 pos 位置的元素设为 value(更新) 
public void set(int pos, int value) {
        checkPos(pos);
        this.elem[pos] = value;
    }

8、删除第一次出现的关键字key

    //删除第一次出现的关键字key
    public void remove(int toRemove) {
        //获取被删除元素的下标
        int index = indexOf(toRemove);
        if(index == -1){
            System.out.println("没有这个数据");
            return;
        }
        for (int i = index; i < this.usedSized - 1; i++) {
            this.elem[i] = this.elem[i+1];
        }
        //引用类型
        //elem[usedSized-1] = null;
        this.usedSized--;
    }

9、获取顺序表长度 

// 获取顺序表长度
    public int size() {
        return this.usedSized;
    }

10、打印顺序表 

   // 打印顺序表,注意:该方法并不是顺序表中的方法,为了方便看测试结果给出的
    //实际上是遍历数组
    public void display() {
        for (int i = 0; i < this.usedSized; i++) {
            System.out.print(this.elem[i] + " ");
        }

 3、顺序表的使用

   1、创建顺序表

//创建了一个存放整数类型的顺序表并初始化了15个空间 
ArrayList<Integer> list = new ArrayList<>(15);
       ArrayList<Integer> list3 = new ArrayList<>();
        list3.add(10);//在第一次add分配大小为10的内存空间,扩容按照1.5倍的方式进行扩容,扩容的最大容量是int的最大值

2、顺序表中的常用方法

ArrayList<Integer> list3 = new ArrayList<>();
        list3.add(1);
        list3.add(2);
        list3.add(3);
        list3.remove(2);//删除的是下标
        list3.remove(new Integer(2));//删除的是元素,且只删除第一个等于2的元素
        System.out.println(list3.get(0));//获取0下标的值
        list3.set(0,99);//修改0下标的值为99
        System.out.println(list3);
        list3.clear();//清空顺序表

3、截取顺序表及注意事项

        顺序表的截取后的对象指向的是原引用,也就是说能够通过两个对象(截取前、截取后)都能对引用中的值进行修改。

        理解了上述内容后,大家可以想想看下面代码的输出结果:

 ArrayList<Integer> list3 = new ArrayList<>();
        list3.add(1);
        list3.add(2);
        list3.add(3);
        List<Integer> list = list3.subList(0,2);//[0,2)
        //在原List上截取,也就是说指向的是原List的引用,因此修改List的值同时也会修改List3的值
        list.set(0,188);
        System.out.println(list);//一般能够直接sout输出内容时,说明里面一定重写了toString方法
        System.out.println(list3);

        代码输出结果:[188,2]

                                 [188,2,3] 

4、Arraylist的遍历

1、

for (int i = 0; i < list3.size(); i++) {
            System.out.print(list3.get(i) +" ");
        }

2、

 for (Integer x:list3){
            System.out.print(x + " ");
        }

        以上两种方法与之前讲过的数组遍历大同小异,这里就不做过多赘述,下面是使用迭代器进行Arraylist的遍历。

3、

 Iterator<Integer> iterator = list3.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next() + " ");
        }

4、

  ListIterator listIterator = list3.listIterator();
        while (listIterator.hasNext()){
            System.out.print(listIterator.next() + " ");
        }

        考虑到大家记忆困难,循环内的内容可以与之前提到的循环输入类比记忆,大家只需创建迭代器对象的过程即可。

5、从后往前遍历

 ListIterator listIterator2 = list3.listIterator(list3.size());
        while (listIterator2.hasPrevious()){
            System.out.print(listIterator2.previous() + " ");
        }
        System.out.println();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2292211.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Hadoop】Hadoop的HDFS

这里写目录标题 HDFS概述HDFS产出背景及定义HDFS产生背景HDFS定义 HDFS优缺点HDFS优点HDFS缺点 HDFS组成架构HDFS文件块大小 HDFS的Shell操作常用命令实操准备工作上传下载HDFS直接操作 HDFS的API操作客户端环境准备HDFS的API案例实操HDFS文件上传HDFS文件下载HDFS文件更名和移…

C++ Primer 迭代器

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…

简单介绍一下什么是OpenFeign

OpenFeign是什么&#xff1f; OpenFeign是一个声明式的Http客户端&#xff0c;它可以用来发起Http请求 它主要用于SpringCloud微服务之间的通讯&#xff0c;让调用另一个服务的Java方法和调用本地方法一样快速和便捷 之前我们是用RestTemplate写一大堆东西发起Http请求远程调…

力扣动态规划-20【算法学习day.114】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.网格中的最小路径代价 题目链接…

Codeforces Round 1002 (Div. 2)(部分题解)

补题链接 A. Milya and Two Arrays 思路&#xff1a;题意还是比较好理解&#xff0c;分析的话我加了一点猜的成分&#xff0c;对a&#xff0c;b数组的种类和相加小于4就不行&#xff0c;蒋老师的乘完后小于等于2也合理。 AC代码&#xff1a; #include <bits/stdc.h> u…

在线销售数据集分析:基于Python的RFM数据分析方法实操训练

一、前言 个人练习&#xff0c;文章用于记录自己的学习练习过程&#xff0c;分享出来和大家一起学习。 数据集&#xff1a;在线销售数据集 分析方法&#xff1a;RFM分析方法 二、过程 1.1 库的导入与一些必要的初始设置 import pandas as pd import datetime import matplo…

小程序设计和开发:要如何明确目标和探索用户需求?

一、明确小程序的目标 确定业务目标 首先&#xff0c;需要明确小程序所服务的业务领域和目标。例如&#xff0c;是一个电商小程序&#xff0c;旨在促进商品销售&#xff1b;还是一个服务预约小程序&#xff0c;方便用户预订各类服务。明确业务目标有助于确定小程序的核心功能和…

【C语言深入探索】:指针高级应用与极致技巧(二)

目录 一、指针与数组 1.1. 数组指针 1.2. 指向多维数组的指针 1.2.1. 指向多维数组元素的指针 1.2.2. 指向多维数组行的指针 1.3. 动态分配多维数组 1.4. 小结 二、指针与字符串 2.1. 字符串表示 2.2. 字符串处理函数 2.3. 代码示例 2.4. 注意事项 三、指针与文件…

手写MVVM框架-构建虚拟dom树

MVVM的核心之一就是虚拟dom树&#xff0c;我们这一章节就先构建一个虚拟dom树 首先我们需要创建一个VNode的类 // 当前类的位置是src/vnode/index.js export default class VNode{constructor(tag, // 标签名称&#xff08;英文大写&#xff09;ele, // 对应真实节点children,…

【Blazor学习笔记】.NET Blazor学习笔记

我是大标题 我学习Blazor的顺序是基于Blazor University&#xff0c;然后实际内容不完全基于它&#xff0c;因为它的例子还是基于.NET Core 3.1做的&#xff0c;距离现在很遥远了。 截至本文撰写的时间&#xff0c;2025年&#xff0c;最新的.NET是.NET9了都&#xff0c;可能1…

C++11中的bind

官方文档对于bind接口的概述解释&#xff1a;Bind function arguments 在C11中&#xff0c;std::bind 是一个非常有用的工具&#xff0c;用于将函数、成员函数或函数对象与特定的参数绑定在一起&#xff0c;生成一个新的可调用对象。std::bind 可以用于部分应用函数参数、改变…

鼠标拖尾特效

文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果&#xff0c;能够为网页增添独特的视觉体验。它通常通过JavaScript和C…

金山打字游戏2010绿色版,Win7-11可用DxWnd完美运行

金山打字游戏2010绿色版&#xff0c;Win7-11可用DxWnd完美运行 链接&#xff1a;https://pan.xunlei.com/s/VOIAYCzmkbDfdASGJa_uLjquA1?pwd67vw# 进入游戏后&#xff0c;如果输入不了英文字母&#xff08;很可能是中文输入状态&#xff09;&#xff0c;就按一下“Shift”键…

爬虫学习笔记之Robots协议相关整理

定义 Robots协议也称作爬虫协议、机器人协议&#xff0c;全名为网络爬虫排除标准&#xff0c;用来告诉爬虫和搜索引擎哪些页面可以爬取、哪些不可以。它通常是一个叫做robots.txt的文本文件&#xff0c;一般放在网站的根目录下。 robots.txt文件的样例 对有所爬虫均生效&#…

(10) 如何获取 linux 系统上的 TCP 、 UDP 套接字的收发缓存的默认大小,以及代码范例

&#xff08;1&#xff09; 先介绍下后面的代码里要用到的基础函数&#xff1a; 以及&#xff1a; &#xff08;2&#xff09; 接着给出现代版的 读写 socket 参数的系统函数 &#xff1a; 以及&#xff1a; &#xff08;3&#xff09; 给出 一言的 范例代码&#xff0c;获取…

【玩转 Postman 接口测试与开发2_016】第13章:在 Postman 中实现契约测试(Contract Testing)与 API 接口验证(上)

《API Testing and Development with Postman》最新第二版封面 文章目录 第十三章 契约测试与 API 接口验证1 契约测试的概念2 契约测试的工作原理3 契约测试的分类4 DeepSeek 给出的契约测试相关背景5 契约测试在 Postman 中的创建方法6 API 实例的基本用法7 API 实例的类型实…

day8-面向对象

目录 面向对象1、面向对象介绍2、类和对象类和对象类的几个补充注意事项 3、封装 面向对象 1、面向对象介绍 ⭐️面向对象介绍&#xff1a; 面向&#xff1a;拿、找对象&#xff1a;能干活的东西面向对象编程&#xff1a;拿东西过来做对应的事情 面向对象编程的例子&#x…

【Java】位图 布隆过滤器

位图 初识位图 位图, 实际上就是将二进制位作为哈希表的一个个哈希桶的数据结构, 由于二进制位只能表示 0 和 1, 因此通常用于表示数据是否存在. 如下图所示, 这个位图就用于标识 0 ~ 14 中有什么数字存在 可以看到, 我们这里相当于是把下标作为了 key-value 的一员. 但是这…

【自然语言处理(NLP)】生成词向量:GloVe(Global Vectors for Word Representation)原理及应用

文章目录 介绍GloVe 介绍核心思想共现矩阵1. 共现矩阵的定义2. 共现概率矩阵的定义3. 共现概率矩阵的意义4. 共现概率矩阵的构建步骤5. 共现概率矩阵的应用6. 示例7. 优缺点优点缺点 **总结** 目标函数训练过程使用预训练的GloVe词向量 优点应用总结 个人主页&#xff1a;道友老…

如何获取sql数据中时间的月份、年份(类型为date)

可用自带的函数month来实现 如&#xff1a; 创建表及插入数据&#xff1a; create table test (id int,begindate datetime) insert into test values (1,2015-01-01) insert into test values (2,2015-02-01) 执行sql语句,获取月份&#xff1a; select MONTH(begindate)…