目录

  • 1.顺序表的基本介绍
  • 2.顺序表的模拟实现
    • 2.1 常见的功能
    • 2.2 基本框架
    • 2.3 方法的实现
      • 2.3.1 add方法
      • 2.3.2 size方法
      • 2.3.3 display方法
      • 2.3.4 add(int pos,E data)方法
      • 2.3.5 remove方法
      • 2.3.6 get方法
      • 2.3.7 contain方法
      • 2.3.8 indexOf方法
      • 2.3.9 set方法
      • 2.3.10 clear方法
    • 2.4方法的使用
  • 3.顺序表的应用
    • 3.1 创建卡牌
    • 3.2 牌的实现
    • 3.3 发牌
  • 4.代码链接

1.顺序表的基本介绍

顺序表在内存中的存储是连续的,它是线性表中的其中一种,使用顺序表可以对数据进行增删查改。

2.顺序表的模拟实现

2.1 常见的功能

// 新增元素,默认在数组最后新增
public void add(E data) { }
// 在 pos 位置新增元素
public void add(int pos, E data) { }
// 判定是否包含某个元素
public boolean contains(E toFind) { return true; }
// 查找某个元素对应的位置
public int indexOf(int toFind) { return -1; }
// 获取 pos 位置的元素
public E get(int pos) { return null; }
// 给 pos 位置的元素设为 value
public void set(int pos, E value) { }
//删除第⼀次出现的关键字key
public void remove(E toRemove) { }
// 获取顺序表⻓度
public int size() { return 0; }
// 清空顺序表
public void clear() { }
// 打印顺序表,注意:该⽅法并不是顺序表中的⽅法,为了⽅便看测试结果给出的
public void display() { }

2.2 基本框架

顺序表在内存中的存储是连续的,可以理解为顺序表在底层存放类似于数组的存放,所以在模拟实现时要定义一个数组,在增删除查改的过程中数据的实际存储会变化,可以再定义一个变量统计实际顺序表中存储的元素个数。

//顺序表
public class myArrayList<E> {public Object[] arrays;//存放数据public int usedSize;//统计个数public static int initialCapacity = 5;//默认容量public myArrayList(){//创建同时定义大小arrays = new Object[initialCapacity];}//方法// 新增元素,默认在数组最后新增public void add(E data) { }// 在 pos 位置新增元素public void add(int pos, E data) { }// 判定是否包含某个元素public boolean contains(int toFind) { return true; }// 查找某个元素对应的位置public int indexOf(E toFind) { return -1; }// 获取 pos 位置的元素public E get(int pos) { return null; }// 给 pos 位置的元素设为 valuepublic void set(int pos, E value) { }//删除第⼀次出现的关键字keypublic void remove(int toRemove) { }// 获取顺序表⻓度public int size() { return 0; }// 清空顺序表public void clear() { }// 打印顺序表,注意:该⽅法并不是顺序表中的⽅法,为了⽅便看测试结果给出的public void display() { }
}

2.3 方法的实现

2.3.1 add方法

 private void add_capacity(Object[] arrays){//二倍扩容arrays = Arrays.copyOf(arrays,arrays.length * 2);}// 新增元素,默认在数组最后新增public void add(E data) { //1.添加元素前需要判断是否容量是否未满if(usedSize == arrays.length){//如果容量已满扩容add_capacity(arrays);}//2.增加元素arrays[usedSize] = data;usedSize++;//下次增加的下标}

2.3.2 size方法

// 获取顺序表⻓度public int size() { //返回usedSize,实际使用的长度return usedSize;}

2.3.3 display方法

// 打印顺序表,注意:该⽅法并不是顺序表中的⽅法,为了⽅便看测试结果给出的public void display() {//1.判断是否为空if(usedSize == 0){return;//无需打印}//2.打印for (int i = 0; i < arrays.length; i++) {System.out.print(arrays[i] + " ");}}

2.3.4 add(int pos,E data)方法


public class PosillegalException extends RuntimeException{public PosillegalException() {}public PosillegalException(String message) {super(message);}
}
 // 在 pos 位置新增元素public void add(int pos, E data) {//1.判断是否需要扩容if(usedSize == arrays.length){add_capacity(arrays);}//2.坐标的使用需要判断是否合法if(pos < 0 || pos > usedSize){throw new PosillegalException("坐标非法:" + pos);}//3.增加:将pos位置后面的元素往后移动,再增加for (int i = usedSize - 1;i <= pos;i--){arrays[usedSize] = arrays[usedSize + 1];}arrays[pos] = data;usedSize++;//元素+1}

2.3.5 remove方法

 //删除第⼀次出现的关键字keyprivate int search(E toRemove){for (int i = 0; i < arrays.length; i++) {if(arrays[i] == toRemove){return i;}}return -1;}public void remove(E toRemove) {//1.遍历数组查询是否存在int pos = search(toRemove)if (pos == -1) {System.out.println(toRemove + "不存在该元素!");return;}//2.在指定下标开始,从前往后覆盖for (int i = pos; i < usedSize - 1; i++) {arrays[i] = arrays[i + 1];}//3.元素减一usedSize--;}

2.3.6 get方法

// 获取 pos 位置的元素public E get(int pos) { //1.判断坐标是否合法if(pos < 0 || pos >= usedSize){throw new PosillegalException("坐标非法:" + pos);}//2.返回return (E)arrays[pos]; }

2.3.7 contain方法

    // 判定是否包含某个元素public boolean contains(E toFind) {//1.判断是否为空if(usedSize == 0) return false;//2.调用search方法int pos = search(toFind);//3.判断if(pos == -1) return false;else return true;}

2.3.8 indexOf方法

 // 查找某个元素对应的位置private boolean isEmpty(){return usedSize == 0;}public int indexOf(E toFind) { //1.判断是否为空if(isEmpty()) return -1;//2.使用searchreturn search(toFind);}

2.3.9 set方法

   // 给 pos 位置的元素设为 valuepublic void set(int pos, E value) {//1.判断坐标是否合法if(pos < 0 || pos >= usedSize){throw new PosillegalException("坐标非法:"+ pos);}//2.考虑是否扩容if(usedSize == arrays.length){add_capacity(arrays);}//3.设置arrays[pos] = value;}

2.3.10 clear方法

 // 清空顺序表public void clear() {//数组中的元素是E类型(泛型),有可能是引用数据类型//需要将元素设置为nullfor (int i = 0; i < usedSize; i++) {arrays[i] = null;}//将数组引用设置为nullarrays = null;}

2.4方法的使用

public class Main{public static void main(String[] args) {myArrayList<Integer> myArrayList = new myArrayList<>();myArrayList.add(1);//增加myArrayList.add(1,2);myArrayList.display();//展示System.out.println("=====");myArrayList.remove(2);//移除myArrayList.set(0,3);//设置boolean ret = myArrayList.contains(1);//查询是否包含System.out.println(ret);int pos = myArrayList.indexOf(0);//查找位置System.out.println(pos);int e = myArrayList.get(0);//获取System.out.println(e);myArrayList.clear();//回收顺序表myArrayList.display();}
}

在这里插入图片描述

3.顺序表的应用

顺序表是连续存储的一块内存空间,在游戏中使用比较广泛,利用顺序表可以实现简单的洗牌算法

3.1 创建卡牌

//牌
public class Card {public int rank;//牌值public String suit;//花色//重写toString方法@Overridepublic String toString() {return  String.format("%s %d",suit,rank);}
}

3.2 牌的实现

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;/**/
public class CardDemo {//花色public static String[] Suit = {"♦","♣","♥","♠"};//使用顺序表实现一副牌(不包含大小王)public List<Card> buyDeck(){List<Card> deck = new ArrayList<>(52);for (int i = 0; i < 4; i++) {//花色for (int j = 1; j <= 13; j++) {//牌值String suit = Suit[i];int rank = j;Card card = new Card();card.suit = suit;card.rank = rank;deck.add(card);}}return deck;}//打乱顺序:生成随机坐标,与指定坐标交换private static void swap(List<Card> deck,int i,int j ){Card card = deck.get(i);deck.set(i,deck.get(j));deck.set(j,card);}private static List<Card> shuffle(List<Card> deck){Random random = new Random();int j = random.nextInt(52);//0 - 51for (int i = deck.size() - 1; i >= 0 ; i--) {swap(deck,i,j);}return deck;}}

简单测试实现的排序

 public static void main(String[] args) {CardDemo cardDemo = new CardDemo();List<Card> deck = cardDemo.buyDeck();System.out.println(deck);//洗牌前deck = CardDemo.shuffle(deck);System.out.println(deck);//洗牌后}

在这里插入图片描述

3.3 发牌

 public static void main(String[] args) {CardDemo cardDemo = new CardDemo();List<Card> deck = cardDemo.buyDeck();System.out.println(deck);//洗牌前deck = CardDemo.shuffle(deck);System.out.println(deck);//洗牌后List<List<Card>> hand = new ArrayList<>();hand.add(new ArrayList<>());hand.add(new ArrayList<>());hand.add(new ArrayList<>());//发牌:一共发5轮,一轮每人发一张for (int i = 0; i < 5; i++) {for (int j = 0; j < 3; j++) {hand.get(j).add(deck.remove(0));}}//第一个人的牌System.out.println(hand.get(0));//第二个人的牌System.out.println(hand.get(1));//第三个人的牌System.out.println(hand.get(2));//剩余的牌System.out.println(deck);}}

在这里插入图片描述

4.代码链接

顺序表的使用

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

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

相关文章

rust语言 (1.88) egui (0.32.1) 学习笔记(逐行注释)(二十六)windows平台运行时隐藏控制台

1、主程序第一句添加&#xff1a; 必须放在所有代码第一句 #![cfg_attr(windows, windows_subsystem "windows")]2、 编译命令&#xff1a;cargo build --release3、 编译完成后运行可执行文件&#xff1a; 项目目录/target/release/项目名.exe

什么是静态住宅IP 跨境电商为什么要用静态住宅IP

静态住宅IP的定义静态住宅IP是指由互联网服务提供商&#xff08;ISP&#xff09;分配给家庭用户的固定IP地址。与动态IP不同&#xff0c;静态IP不会频繁变动&#xff0c;长期保持稳定。其特点包括&#xff1a;固定性&#xff1a;IP地址长期不变&#xff0c;适合需要稳定网络环境…

RabbitMQ 初步认识

目录 1. 基本概念 2. RabbitMq 的工作流程 3. 协议 4. 简单的生产者, 消费者模型 4.1 我们先引入 rabbitmq 的依赖 4.2 生产者 4.3 消费者 1. 基本概念 Pruducer : 生产者, 产生消息Consumer : 消费者, 消费消息Broker : RabbitMq Server, 用来接收和发送消息Connectio…

Redis(46) 如何搭建Redis哨兵?

搭建 Redis 哨兵&#xff08;Sentinel&#xff09;集群&#xff0c;确保 Redis 服务具有高可用性。以下是详细的步骤&#xff0c;从 Redis 安装、配置主从复制到配置和启动 Sentinel 集群&#xff0c;并结合相关的代码示例。 步骤 1&#xff1a;安装 Redis 首先&#xff0c;需要…

Grafana 多指标相乘

PromQL中多指标相乘 PromQL表达式&#xff1a; 0.045 * h9_daily_income{coin"nock"} * h9_pool_price_cny{coin"nock"}&#x1f4c8; 基础&#xff1a;单指标运算 常数与指标相乘 在PromQL中&#xff0c;常数与指标的乘法是最简单的运算&#xff1a; # ✅…

【微服务】springboot3 集成 Flink CDC 1.17 实现mysql数据同步

目录 一、前言 二、常用的数据同步解决方案 2.1 为什么需要数据同步 2.2 常用的数据同步方案 2.2.1 Debezium 2.2.2 DataX 2.2.3 Canal 2.2.4 Sqoop 2.2.5 Kettle 2.2.6 Flink CDC 三、Flink CDC介绍 3.1 Flink CDC 概述 3.1.1 Flink CDC 工作原理 3.2 Flink CDC…

分布式数据架构

分布式数据架构是一种将数据分散存储在多台独立计算机&#xff08;节点&#xff09;上&#xff0c;并通过网络协调工作的系统设计。其核心目标是解决海量数据处理、高并发访问、高可用性及可扩展性等传统集中式数据库难以应对的挑战。以下是关键要点解析&#xff1a;一、核心原…

Spark 中spark.implicits._ 中的 toDF和DataFrame 类本身的 toDF 方法

1. spark.implicits._ 中的 toDF&#xff08;隐式转换方法&#xff09;本质这是一个隐式转换&#xff08;implicit conversion&#xff09;&#xff0c;通过 import spark.implicits._ 被引入到作用域中。它的作用是为本地 Scala 集合&#xff08;如 Seq, List, Array 等&#…

如何在MacOS上卸载并且重新安装Homebrew

Homebrew是一款针对macOS操作系统的包管理工具&#xff0c;它允许用户通过命令行界面轻松安装、升级和管理各种开源软件包和工具。Homebrew是一个非常流行的工具&#xff0c;用于简化macOS系统上的软件安装和管理过程。一、卸载 Homebrew方法1&#xff1a;官方卸载脚本&#xf…

如何简单理解状态机、流程图和时序图

状态机、流程图和时序图都是软件工程中用来描述系统行为的工具&#xff0c;但它们像不同的“眼镜”一样&#xff0c;帮助我们从不同角度看问题。下面用生活比喻来简单理解思路&#xff1a;状态机&#xff1a;想象一个交通信号灯。它总是在“红灯”“黄灯”“绿灯”这些状态之间…

消失的6个月!

已经6个月没有更新了 四个月的研一下生活 两个月暑假&#xff0c;哈哈&#xff0c;其实也没闲着。每天都有好好的学习&#xff0c;每天学习时长6h 暑假按照导师的指示开始搞项目了&#xff0c;项目是关于RAG那块中的应用场景&#xff0c;简单来说就是deepseek puls ,使用大…

Android开发——初步学习Activity:什么是Activity

Android开发——初步学习Activity&#xff1a;什么是Activity ​ 在 Android 中&#xff0c;Activity 是一个用于展示用户界面的组件。每个 Activity 通常对应应用中的一个屏幕&#xff0c;例如主界面、设置界面或详情页。Activity 负责处理用户的输入事件&#xff0c;更新 UI&…

【左程云算法03】对数器算法和数据结构大致分类

目录 对数器的实现 代码实现与解析 1. 随机样本生成器 (randomArray) 2. 核心驱动逻辑 (main 方法) 3. 辅助函数 (copyArray 和 sameArray) 对数器的威力 算法和数据结构简介​编辑 1. 硬计算类算法 (Hard Computing) 2. 软计算类算法 (Soft Computing) 核心观点 一个…

MATLAB | 绘图复刻(二十三)| Nature同款雷达图

Hello 真的好久不见&#xff0c;这期画一个Nature同款雷达图&#xff0c;原图是下图中的i图&#xff0c;长这样&#xff1a; 本图出自&#xff1a; Pan, X., Li, X., Dong, L. et al. Tumour vasculature at single-cell resolution. Nature 632, 429–436 (2024). https://d…

React Hooks UseCallback

开发环境&#xff1a;React Native Taro TypescriptuseCallback的用途&#xff0c;主要用于性能优化&#xff1a;1 避免不必要的子组件重渲染&#xff1a;当父组件重渲染时&#xff0c;如果传递给子组件的函数每次都是新创建的&#xff0c;即使子组件使用了 React.memo&#…

使用SD为VFX制作贴图

1.制作遮罩 Gradient Linear 1 通过Blend 可以混合出不同遮罩 2.径向渐变 Shape 节点 , 非常常用 色阶调节灰度和渐变过渡 曲线能更细致调节灰度 色阶还可以反向 和圆盘混合 就是 菲涅尔Fresnel 3. 屏幕后处理渐变 第二种方法 4. 极坐标 Gradient Circular Threshold 阈值节…

面经分享二:Kafka、RabbitMQ 、RocketMQ 这三中消息中间件实现原理、区别与适用场景

一、实现原理 (Implementation Principle) 1. Apache Kafka&#xff1a;分布式提交日志 (Distributed Commit Log) Kafka 的核心设计理念是作为一个分布式、高吞吐量的提交日志系统。它不追求消息的复杂路由&#xff0c;而是追求数据的快速、持久化流动。 存储结构&#xff1a;…

Android开发——初步了解AndroidManifest.xml

Android开发——初步了解AndroidManifest.xml ​ AndroidManifest.xml 是 Android 应用的清单文件&#xff0c;包含了应用的包名、组件声明、权限声明、API 版本信息等。它是 Android 应用的“说明书”&#xff0c;系统通过它了解应用的结构和行为。咱们的AndroidManifest文件实…

ecplise配置maven插件

1.下载maven 2.配置系统变量 MAVEN_HOME&#xff1a; E:\CODE\MAVEN\apache-maven-3.0.4 3.配置环境变量 %MAVEN_HOME%\bin 4.cmd&#xff1a;mvn -version 注1 如图所示为&#xff1a;成功 注1&#xff1a;配置成功的前提是要有配置JAVA_HOME,如果没有配置&#xff0c;则…

Vue 项目性能优化实战

性能优化有一套「发现 → 定位 → 解决」的闭环方法论。本文以真实项目为蓝本&#xff0c;从编码阶段到上线监控&#xff0c;给出一条可落地的 Vue 性能优化路线图。 一、量化指标定位性能瓶颈 任何优化之前先用量化证据锁死问题。 Lighthouse 一键跑分&#xff1a;首屏、交互、…