数据结构*集合框架顺序表-ArrayList

集合框架

常见的集合框架
在这里插入图片描述
在这里插入图片描述

什么是顺序表

顺序表是一种线性表数据结构,它借助一组连续的存储单元来依次存储线性表中的数据元素。一般情况下采用数组存储。 在数组上完成数据的增删查改。

自定义简易版的顺序表

代码展示:

public interface IArrayList {//新增元素,默认在数组最后新增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 位置的元素设为 valuevoid set(int pos, int value);//删除第⼀次出现的关键字keyvoid remove(int toRemove);//获取顺序表⻓度int size();//清空顺序表void clear();
}
import java.util.Arrays;public class MyArrayList implements IArrayList {private int useSize;private int[] elem;public MyArrayList() {this.elem = new int[Constant.DEFAULT_CAPACITY];}@Override//新增元素,默认在数组最后新增public void add(int data) {//1、是否能继续存放数据,不能就进行扩容if(isFill()) {grow();}//2、在数组末尾添加数据this.elem[useSize] = data;this.useSize++;}@Override//在 pos 位置新增元素public void add(int pos, int data) {//1、是不是满的if(isFill()) {grow();}//2、检查pos位置的合法性checkPosAdd(pos);//3、移动数据for (int i = useSize - 1; i >= pos ; i--) {elem[i+1] = elem[i];}/*if (useSize - pos >= 0) {System.arraycopy(elem, pos, elem, pos + 1, useSize - pos);}*/elem[pos] = data;useSize++;}private void checkPosAdd(int pos) {if(pos < 0 || pos > this.useSize) {throw new PosException(Constant.ADD_CHECK_MASSAGE);}}@Override//判定是否包含某个元素public boolean contains(int toFind) {for (int i = 0; i < this.useSize; i++) {if(elem[i] == toFind) {return true;}}return false;}@Override//查找某个元素对应的位置public int indexOf(int toFind) {for (int i = 0; i < this.useSize; i++) {if(elem[i] == toFind) {return i;}}return 0;}@Override//获取 pos 位置的元素public int get(int pos) {//1、判断顺序表是否为空if(isEmpty()) {throw new isEmptyException(Constant.EMPTY_MASSAGE);}//2、判断pos位置是否合法checkPos(pos);return elem[pos];}private void checkPos(int pos) {if(pos < 0 || pos >= this.useSize) {throw new PosException(Constant.GET_CHECK_MASSAGE);}}@Override//给 pos 位置的元素设为 valuepublic void set(int pos, int value) {if(isEmpty()) {throw new isEmptyException(Constant.EMPTY_MASSAGE);}checkPos(pos);elem[pos] = value;}@Override//删除第⼀次出现的关键字keypublic void remove(int toRemove) {if(isEmpty()) {throw new isEmptyException(Constant.EMPTY_MASSAGE);}int index = indexOf(toRemove);if(index == -1) {System.out.println("没有你要删除的数据");return;}for (int i = index; i < this.useSize - 1; i++) {elem[i] = elem[i+1];}elem[useSize - 1] = 0;useSize--;}@Override//获取顺序表⻓度public int size() {return this.useSize;}@Override//清空顺序表public void clear() {for (int i = 0; i < this.useSize; i++) {this.elem[i] = 0;}this.useSize = 0;}//是否为空private boolean isEmpty() {return useSize == 0;}//是否存满private boolean isFill() {return this.useSize == this.elem.length;//判断有效数据是否等于总数组长度}//数据扩容private void grow() {this.elem = Arrays.copyOf(this.elem,elem.length*2);}@Overridepublic String toString() {return Arrays.toString(elem);}
}
public class PosException extends RuntimeException{public PosException() {super();}public PosException(String message) {super(message);}
}
public class isEmptyException extends RuntimeException{public isEmptyException() {super();}public isEmptyException(String message) {super(message);}
}
public class Constant {public static final int DEFAULT_CAPACITY = 5;public static final String EMPTY_MASSAGE = "顺序表为空";public static final String GET_CHECK_MASSAGE = "get方法的pos位置不合法";public static String ADD_CHECK_MASSAGE = "add方法的pos位置不合法";
}
public class Test {public static void main(String[] args) {MyArrayList myArrayList = new MyArrayList();myArrayList.add(1);myArrayList.add(2);myArrayList.add(3);myArrayList.add(4);myArrayList.add(2,10);myArrayList.add(2,10);System.out.println(myArrayList.contains(9));System.out.println(myArrayList.get(0));myArrayList.set(1,20);myArrayList.remove(10);System.out.println(myArrayList.size());System.out.println(myArrayList);myArrayList.clear();System.out.println(myArrayList);}
}

代码解释:

1、定义了一个IArrayList接口,里面有需要实现的方法。
2、Constant类用来存放一些常量。
3、自定义了一个MyArrayList顺序表。useSize表示数据中的有效长度,elem[]表示存储数据的数组。在构造方法中初始化了数组的默认大小。实现了如下方法:

方法功能
void add(int data)新增元素,默认在数组最后面新增
void add(int pos,int data)在pos位置新增元素
boolean contains(int toFind)判断是否包含某个元素
int indexOf(int toFind)查找某个元素对应的位置
int get(int pos)获得pos位置的元素
void set(int pos,int value)给pos位置的元素设为value
void remove(int toRemove)删除第一次出现的关键字toRemove
int size()获得顺序表长度
void clear()清空顺序表
4、两个自定义异常,分别表示数组中没有元素、pos位置不合法。
5、对于数据结构来说是很严谨的,需要考虑各种情况。将可能发生的情况进行书写。

官方定义的顺序表-ArrayList

类的属性

在这里插入图片描述

构造方法

有三种构造方法

无参构造方法

在这里插入图片描述

public static void test1() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add("Hello");//报错System.out.println(arrayList);List<String> list = new ArrayList<>();//向上转型list.add("Hello");list.add("World");System.out.println(list);
}

此时new的是一个空的列表。arrayList已经限定为Integer类型,不能接收String类型。
对于add方法,查看源码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
grow方法就是扩容操作,完成的是1.5倍扩容。

指定顺序表初始容量

在这里插入图片描述

public static void test2() {ArrayList<Integer> arrayList = new ArrayList<>(20);arrayList.add(10);arrayList.add(20);arrayList.add(30);System.out.println(arrayList);
}

利用其他Collection构建ArrayList

在这里插入图片描述

public static void test3() {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);System.out.println(arrayList);ArrayList<Integer> arrayList1 = new ArrayList<>(arrayList);arrayList1.add(10);System.out.println(arrayList1);ArrayList<Number> arrayList2 = new ArrayList<>(arrayList);arrayList2.add(100);System.out.println(arrayList2);System.out.println(arrayList1);ArrayList<String> stringArrayList = new ArrayList<>(arrayList);//报错
}

输出:
[1]
[1, 10]
[1, 100]
[1, 10]

说明这种构造方法是创建一个新(单独)的列表,并继承传入的列表已有的值。

ArrayList常见操作

方法功能
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

代码案例:

import java.util.ArrayList;
import java.util.List;public class Test {public static void main(String[] args) {ArrayList<Integer> arrayList = new ArrayList<>();arrayList.add(1);arrayList.add(2);arrayList.add(3);arrayList.add(4);arrayList.add(4,10);System.out.println(arrayList);//arrayList.add(6,10);//报错,IndexOutOfBoundsExceptionArrayList<Integer> arrayList1 = new ArrayList<>();arrayList1.addAll(arrayList);System.out.println(arrayList1);arrayList1.add(5);System.out.println(arrayList);System.out.println("===========");arrayList.remove(4);System.out.println(arrayList);System.out.println("===========");Integer i = 4;arrayList.remove(i);System.out.println(arrayList);System.out.println("===========");System.out.println(arrayList.get(2));System.out.println("===========");arrayList.set(1,100);System.out.println(arrayList);System.out.println("===========");System.out.println(arrayList.contains(10));System.out.println("===========");ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);list.add(8);list.add(9);list.add(10);System.out.println(list);//[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]List<Integer> sublist = list.subList(2, 7);System.out.println(sublist);//[3, 4, 5, 6, 7]sublist.set(0,100);System.out.println(sublist);//[100, 4, 5, 6, 7]System.out.println(list);//[1, 2, 100, 4, 5, 6, 7, 8, 9, 10]}
}

代码解释:

需要注意的是:
1、subList()方法截取的范围是 [ fromeIndex,toIndex )
2、这里的截取并不是创建一个新的顺序表,而是获取原表上fromeIndex的地址。所以修改的是原表上的值。

ArrayList的遍历

代码案例:

public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);System.out.println("--------for循环遍历--------");for(int i = 0; i < list.size();i++) {System.out.print(list.get(i)+" ");}System.out.println();System.out.println("--------foreach循环遍历--------");for (Integer integer : list) {System.out.print(integer + " ");}System.out.println();System.out.println("--------迭代器正序输出1--------");Iterator<Integer> it = list.listIterator();while (it.hasNext()) {System.out.print(it.next()+" ");}System.out.println();System.out.println("--------迭代器正序输出2--------");ListIterator<Integer> its = list.listIterator();while (its.hasNext()) {System.out.print(its.next()+" ");}System.out.println();System.out.println("--------迭代器正序输出3(从指定下标位置输出)--------");ListIterator<Integer> itss = list.listIterator(2);while (itss.hasNext()) {System.out.print(itss.next()+" ");}System.out.println();System.out.println("--------迭代器逆序输出--------");ListIterator<Integer> reits = list.listIterator(list.size());while (reits.hasPrevious()) {System.out.print(reits.previous()+" ");}
}

输出:
--------for循环遍历--------
1 2 3 4 5 6 7
--------foreach循环遍历--------
1 2 3 4 5 6 7
--------迭代器正序输出1--------
1 2 3 4 5 6 7
--------迭代器正序输出2--------
1 2 3 4 5 6 7
--------迭代器正序输出3从指定下标位置输出--------
3 4 5 6 7
--------迭代器逆序输出--------
7 6 5 4 3 2 1

代码解释:

1、list.listIterator() 是调用 list 对象的方法来获取一个列表迭代器。it.hasNext() 是判断迭代器 it 是否还有下一个元素。it.next() 方法会返回迭代器指向的下一个元素(即列表中的下一个 Integer 元素)。
2、实现了Iterator接口就能使用迭代器进行打印。
3、ListIterator接口继承了Iterator接口,也就是说有更多的方法。

嵌套列表

代码案例

1、

public static void test() {List<List<Integer>> list = new ArrayList<>();List<Integer> list0 = new ArrayList<>();list0.add(10);list0.add(100);list0.add(1000);List<Integer> list1 = new ArrayList<>();list1.add(20);list1.add(200);List<Integer> list2 = new ArrayList<>();list2.add(30);list2.add(300);List<Integer> list3 = new ArrayList<>();list3.add(40);list3.add(400);list3.add(4000);List<Integer> list4 = new ArrayList<>();list4.add(50);list4.add(500);list.add(list0);list.add(list1);list.add(list2);list.add(list3);list.add(list4);for(int i = 0; i < list.size();i++) {for (int j = 0; j < list.get(i).size(); j++) {System.out.print(list.get(i).get(j)+" ");}System.out.println();}System.out.println();
}

输出:
10 100 1000
20 200
30 300
40 400 4000
50 500

关系大致如图所示:
在这里插入图片描述
2、

public static List<List<Integer>> generate(int numRows) {List<List<Integer>> ret = new ArrayList<>();//定义起始行List<Integer> list0 = new ArrayList<>();list0.add(1);ret.add(list0);//定义后面的行for (int i = 1; i < numRows; i++) {//定义每行列表List<Integer> currentRow = new ArrayList<>();//第一个元素都是1currentRow.add(1);//中间操作List<Integer> preRow = ret.get(i - 1);for (int j = 1; j < i; j++) {//按照规律添加元素currentRow.add(preRow.get(j) + preRow.get(j-1));}//每行最后一个元素都是1currentRow.add(1);//currentRow行存储到ret中ret.add(currentRow);}return ret;
}public static void main(String[] args) {List<List<Integer>> list = generate(5);for (List<Integer> integers : list) {for (Integer integer : integers) {System.out.print(integer + " ");}System.out.println();}System.out.println();
}

关系大致如图所示:
在这里插入图片描述

代码解释:

1、本质上是一个二维列表,可用于存储和操作二维数据结构。
2、代码二,实现的是杨辉三角的输出。

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

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

相关文章

使用openpyxl时的一些注意点

一、是否需要close()&#xff1f; 在使用 openpyxl 时&#xff0c;wb.save() 后一般不需要再手动调用 wb.close()。wb.save() 会自动处理文件写入和释放。 如果是使用openpyxl.load_workbook(filename, read_onlyTrue) 打开了一个只读模式的工作簿&#xff0c;此时会建立文件…

Python爬虫第11节-解析库Beautiful Soup的使用上篇

目录 前言 一、Beautiful Soup 简介 1.1 Beautiful Soup概述 1.2 准备工作 1.3 解析器 二、基本使用 三、节点选择器的使用 3.1 选择元素 3.2 提取信息 3.2.1 获取名称 3.2.2 获取属性 3.2.3 获取内容 3.3 嵌套选择 3.4 关联选择 3.4.1 子节点和子孙节点 3.4.2…

【Docker-13】Docker Container容器

Docker Container&#xff08;容器&#xff09; 一、什么是容器&#xff1f; 通俗地讲&#xff0c;容器是镜像的运行实体。镜像是静态的只读文件&#xff0c;而容器带有运行时需要的可写文件层&#xff0c;并且容器中的进程属于运行状态。即容器运行着真正的应用进程。容器有…

Spring Cache(笔记)

简介&#xff1a; 常用注解&#xff1a;

大模型Qwen32b(FP16精度)部署所需的显存大小和并发数计算分析

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下大模型Qwen32b(FP16精度)部署所需的显存大小和并发计算分析。 文章目录 1. 大模型显存需求分析1.1 模型参数与显存占用1.2 不同精度对显存的影响 2. 不同显卡配置下的并发能力2.1 80G显卡并发能力2.2 64G显卡并发能…

【euclid】10.2 2D变换模块(transform2d.rs)Arbitrary trait

源码 #[cfg(feature "arbitrary")] impl<a, T, Src, Dst> arbitrary::Arbitrary<a> for Transform2D<T, Src, Dst> whereT: arbitrary::Arbitrary<a>, {fn arbitrary(u: &mut arbitrary::Unstructured<a>) -> arbitrary::Res…

MAC Mini M4 上测试Detectron2 图像识别库

断断续续地做图像识别的应用&#xff0c;使用过各种图像识别算法&#xff0c;一开始使用openCV 做教室学生计数的程序。以后又使用YOLO 做医学伤口检测程序。最近&#xff0c;开始使用meta 公司的Detectron2.打算做OCR 文档结构分析 Detectron2 的开发者是 Meta 的 Facebook AI…

一天时间,我用AI(deepseek)做了一个配色网站

前言 最近在开发颜色搭配主题的相关H5和小程序&#xff0c;想到需要补充一个web网站&#xff0c;因此有了这篇文章。 一、确定需求 向AI要答案之前&#xff0c;一定要清楚自己想要做什么。如果你没有100%了解自己的需求&#xff0c;可以先让AI帮你理清逻辑和思路&#xff0c;…

机器视觉用消色差双合透镜

光学系统案例&#xff1a;机器视觉用消色差双合透镜 一、设计规格 1. 应用场景&#xff1a;专为工业相机成像而设计&#xff0c;工作于可见光波段&#xff0c;旨在满足该领域对高精度成像的需求。 2. 核心参数&#xff1a; • 焦距&#xff1a;精确要求达到 50 mm 1%&#…

批量归一化(Batch Normalization)原理与PyTorch实现

批量归一化&#xff08;Batch Normalization&#xff09;是加速深度神经网络训练的常用技术。本文通过Fashion-MNIST数据集&#xff0c;演示如何从零实现批量归一化&#xff0c;并对比PyTorch内置API的简洁实现方式。 1. 从零实现批量归一化 1.1 批量归一化函数实现 import t…

feedback

这个文件 lib/pages/feedback/index.dart 是一个反馈/留言表单页面的实现&#xff0c;主要功能是&#xff1a; 表单收集功能&#xff1a; 真实姓名&#xff08;必填&#xff09;联系电话&#xff08;必填&#xff0c;需要验证手机号格式&#xff09;电子邮箱&#xff08;选填&a…

数据仓库标准库模型架构相关概念浅讲

数据仓库与模型体系及相关概念 数据仓库与数据库的区别可参考&#xff1a;数据库与数据仓库的区别及关系_数据仓库和数据库-CSDN博客 总之&#xff0c;数据库是为捕获数据而设计&#xff0c;数据仓库是为分析数据而设计 数据仓库集成工具 在一些大厂中&#xff0c;其会有自…

适用于 HAL 的 AIDL

目录 设计初衷 注意 编写AIDLHAL接口 查找AIDLHAL接口 扩展接口 将现有HAL从HIDL转换为AIDL AIDL与HIDL之间的主要差异 针对HAL的供应商测试套件(VTS)测试 Android 11 中引入了在 Android 中使用 AIDL 实现 HAL 的功能, 从而可以在不使用 HIDL 的情况下实现 Android 的部分…

leetcode0547. 省份数量-medium

1 题目&#xff1a;省份数量 官方标定难度&#xff1a;中 有 n 个城市&#xff0c;其中一些彼此相连&#xff0c;另一些没有相连。如果城市 a 与城市 b 直接相连&#xff0c;且城市 b 与城市 c 直接相连&#xff0c;那么城市 a 与城市 c 间接相连。 省份 是一组直接或间接相…

【专题刷题】双指针(一)

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;1&#xff0c;本人解法 本人屎山代码&#xff1b;2&#xff0c;优质解法 优质代码&#xff1b;3&#xff0c;精益求精&#xff0c;…

WebSocket 技术详解

引言 在现代Web应用中&#xff0c;实时通信已经成为不可或缺的一部分。想象一下聊天应用、在线游戏、股票交易平台或协作工具&#xff0c;这些应用都需要服务器能够即时将更新推送给客户端&#xff0c;而不仅仅是等待客户端请求。WebSocket技术应运而生&#xff0c;它提供了一…

【redis】初识redis

初识redis Redis 是一种基于键值对&#xff08;key-value&#xff09; 的 NoSQL 的数据库&#xff0c;它与很多键值数据库不同&#xff0c; Redis 中的值可以是 string&#xff08;字符串&#xff09; 、hash&#xff08;哈希&#xff09;、list&#xff08;链表&#xff09;、…

UE5 制作方块边缘渐变边框效果

该效果基于之前做的&#xff08;https://blog.csdn.net/grayrail/article/details/144546427&#xff09;进行修改得到&#xff0c;思路也很简单&#xff1a; 1.打开实时预览 1.为了制作时每个细节调整方便&#xff0c;勾选Live Update中的三个选项&#xff0c;开启实时预览。…

基于springboot的“嗨玩旅游网站”的设计与实现(源码+数据库+文档+PPT)

基于springboot的“嗨玩旅游网站”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;springboot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 局部E-R图 系统首页界面 系统注册…

grafana/loki 部署搜集 k8s 集群日志

grafana/loki 和 grafana/loki-stack 的区别 ​Grafana 提供了多个 Helm Chart 用于在 Kubernetes 集群中部署 Loki 及相关组件,其中主要包括 grafana/loki 和 grafana/loki-stack。​它们的主要区别如下:​ 1.grafana/loki Helm Chart: 专注于 Loki 部署: 该 Chart 专门…