Java数据结构--顺序表

目录

  • 1.介绍
  • 2.顺序表实现
    • 2.1 代码简单实现顺序表
    • 2.2 List接口实现顺序表
  • 3.ArrayList常用方法
  • 4.ArrayList的遍历
    • 4.1 直接打印
    • 4.2 for循环或for-each
    • 4.3 迭代器

1.介绍

线性表(一种广泛使用的数据结构),是n个具有相同特征的数据元素的有限序列,在逻辑上线性表是线性结构(连续的一条直线),在物理结构上不一定连续,通常以数组和链式结构的形式存储。而顺序表就是线性表的一种,它是一段物理地址连续的存储单元依次存储数据元素的线性结构,一般采用数组来存储

2.顺序表实现

顺序表的实现可以通过自己写代码实现(主要为了理解顺序表,需要使用顺序表时不推荐使用自己实现的),或直接使用List接口来实现

2.1 代码简单实现顺序表

import java.util.Arrays;
public class MyArrayList {public int[] elem;public int usedSize;public static final int DEFAULT_SIZE= 10;public MyArrayList() {this.elem = new int[DEFAULT_SIZE];}public void display() { //打印顺序表System.out.println(Arrays.toString(elem));}public void add(int data) { //在数组最后新增元素(尾插)if(isFull()) {this.elem=Arrays.copyOf(elem,elem.length*2);}this.elem[usedSize]=data;this.usedSize++;}public boolean isFull() { //判断数组元素是否已满return this.usedSize==this.elem.length;}private boolean checkPosInAdd(int pos) { //判断新增元素时pos值是否合法if(pos<0||pos>usedSize) {return false;}return true;}public void add(int pos, int data) { //在pos位置新增元素if(!checkPosInAdd(pos)) {throw new PosException("pos的值不合法:"+pos);}if(isFull()) {this.elem=Arrays.copyOf(elem,elem.length*2);}for(int i=usedSize-1;i>=pos;i--) {this.elem[i+1]=this.elem[i];}this.elem[pos]=data;this.usedSize++;}public boolean contains(int toFind) { //判断是否包含某个元素for (int i = 0; i < usedSize; i++) {if (toFind == 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;}public boolean checkPosInGetAndSet(int pos){ //判断设置元素和获取元素时pos值是否合法if(pos<0||pos>=usedSize) {return false;}return true;}public int get(int pos) { //获取pos位置的元素if(!checkPosInGetAndSet(pos)) {throw new PosException("pos值不合法:"+pos);}if(isEmpty()) {throw new EmptyException("顺序表为空");}return this.elem[pos];}private boolean isEmpty() { //判断数组是否没有元素return this.usedSize==0;}public void set(int pos, int value) { //给pos位置的元素设为valueif(!checkPosInGetAndSet(pos)) {throw new PosException("pos的值不合法");}if(isEmpty()) {throw new EmptyException("顺序表为空");}this.elem[pos]=value;}public void remove(int key) { //删除第一次出现的关键词keyif(isEmpty()) {throw new EmptyException("顺序表为空");}int index=indexOf(key);for(int i=index;i<usedSize-1;i++) {this.elem[i]=this.elem[i+1];}this.usedSize--;}public int size() { //获取顺序表长度return this.usedSize;}public void clear() { //清空顺序表usedSize=0;}
}

2.2 List接口实现顺序表

import java.util.ArrayList;
import java.util.List;
public class Main {public static void main(String[] args) {//ArrayList是一个普通的类,实现了List接口(以下两种实现方式都可以,根据创建的list的类型进行选择)ArrayList<Integer> list = new ArrayList<>();List<Integer> list1 = new ArrayList<>();}
}

3.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(截取的list仍指向原list)

4.ArrayList的遍历

4.1 直接打印

ArrayList类重写了toString方法,我们可以使用System.out.println( )直接打印顺序表

import java.util.ArrayList;
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);System.out.println(list);}
}

4.2 for循环或for-each

ArrayList使用数组进行存储,我们可以使用for循环或for-each(两者基本相同)遍历顺序表

import java.util.ArrayList;
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);for (int i = 0; i < list.size(); i++) { //for循环System.out.println(list.get(i));}for (int elem : list) { //for-eachSystem.out.println(elem);}}
}

4.3 迭代器

ArrayList实现了Iterable接口,我们可以创建迭代器对象来打印顺序表

import java.util.ArrayList;
import java.util.Iterator;
public class Main {public static void main(String[] args) {ArrayList<Integer> list = new ArrayList<>();list.add(1);list.add(2);Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {System.out.println(iterator.next());}}
}

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

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

相关文章

设计模式之适配器模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、适配器模式2、适配器模式的使用场景3、优点4、缺点5、主要角色6、代码示例1&#xff09;UML图2&#xff09;源代码&#xff08;1&#xff09;定义一部手机&#xff0c;它有个typec口。&#xff08;2&#xff09;定义一个vga接口。&#xff08;3&#x…

docker入门-快速学会docker

死记硬背一张图 镜像类似于我们是使用的虚拟机&#xff0c;创建虚拟机前需要下载的系统镜像文件&#xff0c;比如iso文件&#xff0c;img文件等等这样一些镜像文件。 容器可以比作正在运行中的一个虚拟机。 tar文件&#xff0c;tar文件类似于vm使用时的vmdk文件。通过load指…

在 Docker容器中安装 ROS-Melodic 并使用 rviz 进行图形化显示

文章目录 写在前面1. 背景描述2. 安装步骤2.1 允许本地机器上的用户或进程连接到 X server2.2 拉取 docker 镜像2.3 使用镜像osrf/ros:melodic-desktop-full创建并运行容器2.4 运行 roscore2.5 运行 rviz 参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04&#xff0…

面网易后台开发居然遇到了一个困难难度算法题

在提供面经的同学中&#xff0c;竟然有同学在面试网易后台研发的时候遇到了一道困难难度的算法题。 一般来说&#xff0c;大多数面试的算法题都是以中等难度为主&#xff0c;遇到困难难度的算法题也许是公司现在不缺人、也许是在选拔人才、当然也很可能是面试官其实并不想要你…

在三维可视化项目中,B/S和C/S架构该如何选择?

一、什么是B/S和C/S 在3D数据可视化中&#xff0c;有两种常见的架构模式&#xff1a;BS&#xff08;Browser/Server&#xff09;和CS&#xff08;Client/Server&#xff09; B/S模式 B/S模式是指将3D数据可视化的逻辑和处理放在服务器端&#xff0c;而在客户端使用浏览器进行…

前端新机部署

编辑器&#xff1a;vscode 下载地址 vscode常用插件 显示代码修改历史、作者等信息 GitLens Nodejs版本 Node版本管理工具 Nvm下载地址 nvm常用命令&#xff1a; nvm ls // 查看安装的所有node.js的版本nvm list available //查看可以安装的所有node.js版本nvm install 版本…

k8s pod详解使用

什么是pod&#xff1f; Kubernetes&#xff08;简称K8s&#xff09;是一个开源的容器编排平台&#xff0c;广泛用于构建、部署和管理容器化应用程序。在K8s中&#xff0c;Pod是一个核心概念&#xff0c;下面是对Pod的详细解释&#xff1a; 一、Pod的定义 Pod是K8s中最小的可…

JQuery的基本使用

jQuery 是一个快速、小巧且功能强大的 JavaScript 库&#xff0c;它使得 HTML 文档的遍历和操作、事件处理、动画和 Ajax 交互变得简单。以下是 jQuery 的基本使用&#xff0c;包括常见的操作和示例。 1. 引入 jQuery 在使用 jQuery 之前&#xff0c;您需要将其引入到您的 HT…

Linux:Ubuntu系统开启SSH服务

在Ubuntu上开启SSH服务&#xff0c;可以按照以下步骤进行&#xff1a; 1.安装OpenSSH服务 如果你还没有安装OpenSSH服务&#xff0c;可以使用以下命令安装&#xff1a; sudo apt update sudo apt install openssh-server2. 启动SSH服务 安装完成后&#xff0c;启动SSH服务&a…

QT应用中的字符编码处理

文章目录 各种编码介绍获取编码列表通过特定编码解析内容特定编码保存文件编码转换设置默认编码在Qt中字符编码问题是一个重要的主题,因为Qt是一个跨平台的框架,涉及到不同操作系统和字符集的兼容性。Qt提供了多种方式来处理字符串和字符编码,确保应用程序能够正确处理和显示…

Docker在linux系统中的下载与使用

Docker在linux系统中的下载与使用 一、docker作用,下载及安装二、docker镜像三、创建容器四、容器数据卷 一、docker作用,下载及安装 ubuntu下载安装docker 命令&#xff1a;在ubuntu上面执行这个命令 Docker version:查看docker是否安装成功 配置阿里云镜像加速:进入阿里云网站…

【WEB应用安全测试指南–蓝队安全测试2】--超详细-可直接进行实战!!!亲测-可进行安全及渗透测试

安全基础理论入门知识参考上一篇《WEB应用安全测试指南蓝队安全测试1》 WEB应用安全测试指南2 一、文件 I/O 类1.1、任意文件上传1.2、任意文件下载1.3、文件包含 二、接口安全类2.1、短信炸弹2.2、邮件炸弹2.3、短信内容可控2.4、邮件内容可控 三、逻辑流程类3.1、越权3.2、未…

k8s部署jenkins集群,配置集群kubernetes plugin的pod模板

先安装jenkins插件&#xff0c;对应的源码地址是kubernetes-plugin&#xff0c;以供参考。 进入节点管理&#xff0c;开始配置。 点击 “ configure clouds” 一、配置集群 填写k8s地址&#xff1a;https://kubernetes.default.svc.cluster.local 命名空间&#xff1a;kuberne…

Redis高并发缓存设计问题与性能优化

1、缓存设计典型问题 1.1、缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c;缓存层和存储层都不会命中&#xff0c;通常出于容错的考虑&#xff0c;如果从存储层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c;失…

【Python】从零到一,搭建高效Web服务器,轻松上手!Python开发者必备(文末附带源码分享)

CSDN Python源码分享&#xff1a;实现一个简单的Web服务器 在CSDN上&#xff0c;我们经常分享各种技术文章和源码&#xff0c;帮助开发者们不断提升自己的技能。今天&#xff0c;我将为大家分享一个使用Python实现的简单Web服务器源码。这个Web服务器能够处理基本的HTTP GET请…

打破常规,BD仓储物流的效能提升!

当前&#xff0c;随着国家战略的推进&#xff0c;JS与民用领域的融合不断加深&#xff0c;物流业也步入了军民融合的新时代。在智能仓储物流方面&#xff0c;JS物流的智能化进展受到了BD系统的高度关注和重视。 一、建设JS仓储物流RFID基础设施 JS物流领域引入RFID技术的基础工…

Jenkins 改成中文语言显示

Jenkins 改成中文语言显示 到系统管理 插件管理中下载如下插件接口 Localization: Chinese (Simplified) 搜索的时候用ctrlf 进行搜索&#xff0c;不要用Jenkins下面下的filter 只有&#xff0c;到系统管理Manage Jenkins下的Config System下&#xff0c;如下截图的位置去…

动态规划算法:14.简单多状态 dp 问题_粉刷房子_C++

题目链接&#xff1a;LCR 091. 粉刷房子 - 力扣&#xff08;LeetCode&#xff09; 一、题目解析 题目&#xff1a; 解析&#xff1a; 由题可知&#xff1a; 涂刷房子有三种颜色可以选&#xff0c;所给的二维数组中三列固定不变&#xff0c;分别是红、蓝、绿相邻两件房子不可…

C++基础面试题 | 什么是内存对齐?为什么需要内存对齐?

文章目录 回答重点扩展知识 回答重点 内存对齐是指计算机在访问内存时&#xff0c;会根据一定规则将数据存储在合适的起始地址上&#xff0c;通常是数据大小的整数倍。这样做可以提升CPU的访问效率&#xff0c;特别是在读取和写入数据时。 为什么要内存对齐&#xff1f;主要有…

无极低码课程【mysql windows下安装要点】

在Windows环境中安装MySQL 5.7教程 MySQL 是世界上最流行的开源关系型数据库管理系统之一。本教程将指导您在Windows操作系统上安装MySQL 5.7。 网上教程较多&#xff0c;这里不再详述&#xff0c;注意关键点即可 准备工作 下载MySQL 5.7安装包 访问 MySQL官方网站 下载MyS…