基于ArrayList实现简单洗牌
前言
在之前的那篇文章中,我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE
基于此,便好理解ArrayList和后面的洗牌游戏了。
什么是ArrayList?
ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表,与普通数组的区别就是它是没有固定大小的限制。
ArrayList的一些常见操作
首先我们要导入一个ArrayList包
import java.util.ArrayList;
在正式调用方法之前,别忘了创建一个ArrayList对象哦~
ArrayList<String> list = new ArrayList<>();
在这里,我就创建了一个只能存储String类型数据的ArrayList(顺序表)
下面便是ArrayList一些常见的使用方法,仔细观察就不难发现这些方法在模拟实现顺序表的时候就已经实现过了,现在直接用就行了,若有不记得了,可查看帮助手册-->Overview (Java SE 17 & JDK 17)
import java.util.ArrayList;public class commonTest {public static void main(String[] args) {// 创建一个ArrayList并添加一些元素ArrayList<String> list = new ArrayList<>();list.add("apple");list.add("banana");list.add("orange");// 使用get方法获取指定位置的元素String fruit = list.get(1);System.out.println("下标为1的水果是: " + fruit);// 使用set方法替换指定位置的元素list.set(0, "hello");System.out.println("替换之后 " + list);// 使用remove方法移除指定位置的元素list.remove(2);System.out.println("移除之后 " + list);// 使用size方法获取列表大小int size = list.size();System.out.println("列表大小: " + size);// 使用contains方法判断列表是否包含指定元素boolean containsBanana = list.contains("banana");System.out.println("是否包含banana " + containsBanana);}}
运行结果如图
运用之实现简单洗牌
纸牌相信大家都接触过,来看看如何利用ArrayList去实现洗牌?
这才是本文的重点哦~理论最终还是要服务与实践的,接下来就由我来带着各位看官来实现吧~
首先思考:
要洗牌,首先要有牌,想要表示出来,那么便要想好牌的属性--->花色和数字,好,那么就可以定义一个Card类专门存储这个,看下图:
public class Card {public int rank; // 表示牌面的数字public String suit; // 表示花色// 构造方法,用于初始化牌的数字和花色public Card(int rank, String suit) {this.rank = rank;this.suit = suit;}// 重写toString()方法,以便打印Card对象时能够直观地展示牌的信息@Overridepublic String toString() {return "Card{" + suit + " " + rank + "}";}
}
这样一来,这个Card类很好地封装了扑克牌的属性。
一张牌肯定不够,一副牌有52张(去掉大小王)---4个花色,1到13的数字,在洗牌之前,先有一副完整的牌才行显示出来才行
于是就新定义一个Cards类,规定好牌的花色
public static final String[] suits = {"♥", "♠", "♣", "♦"};//定义四种花色
还记得final 的作用吗?这里用final 修饰就是为了不被修改
接着通过两个循环,一个遍历花色,一个遍历数字 ,这样一张新牌就创建好了,别忘了要创建存放牌的List,这里就导入了ArrayList包以便用add方法了。
import java.util.ArrayList;
import java.util.List;
// 买一副牌
public List<Card> buyCards() {List<Card> cardList = new ArrayList<>(); // 基于ArrayList创建一个用于存放牌的Listfor (int i = 0; i < 4; i++) { // 循环四种花色for (int j = 0; j < 13; j++) { // 循环13个数字(2-10,J,Q,K,A)int rank = j; // 当前数字String suit = suits[i]; // 当前花色Card card = new Card(rank, suit); // 创建一张新的牌对象cardList.add(card); // 将新牌加入到牌组中}}return cardList; // 返回完整的一副牌
}
此时运行便是这个样子
这下牌有了那就开始洗牌了,洗牌肯定讲究随机,讲到随机少不了Random方法,要调用它,也到导入对应的Random包。将生成的随机数对应的牌(看索引)在遍历的过程中与每个牌的位置进行交换,这样便完成了洗牌,配合代码食用效果更佳~
import java.util.Random;
// 洗牌
public void shuffle(List<Card> cardList) {Random random = new Random(); // 创建一个随机数生成器for (int i = cardList.size(); i > 0; i--) { // 从最后一张牌开始向前遍历int index = random.nextInt(i); // 生成一个随机的索引swap(cardList, i - 1, index); // 将当前牌与随机选出的牌进行交换}
}// 洗牌的原理-交换
public void swap(List<Card> cardList, int i, int j) {Card tmp = cardList.get(i); // 临时保存第i张牌cardList.set(i, cardList.get(j)); // 将第i张牌替换为第j张牌cardList.set(j, tmp); // 将第j张牌替换为临时保存的牌
}
还记得set方法是干嘛的吗?--->替换指定位置的元素,常见的记住可以提高效率的
此时效果是这样的
那么到此牌洗好了,那就开始发牌,假设我们有三个人打牌,为了方便展示,就每人抽4张牌,思考一下,拿到牌后是不是也要存储才是?于是便要创建3个List去接受摸到的牌,
// 发牌,三个人,每个人轮流摸4
public void drawCard(List<Card> cardList) {List<Card> hand1 = new ArrayList<>(); // 第一个人的手牌List<Card> hand2 = new ArrayList<>(); // 第二个人的手牌List<Card> hand3 = new ArrayList<>(); // 第三个人的手牌List<List<Card>> hand = new ArrayList<>(); // 存放三个人的手牌列表hand.add(hand1);hand.add(hand2);hand.add(hand3);for (int i = 0; i < 4; i++) { // 每个人轮流摸4张牌for (int j = 0; j < 3; j++) { // 三个人依次摸牌Card card = cardList.remove(0); // 从牌组中抽取一张牌,并从原来的牌组中移除hand.get(j).add(card); // 将抽取的牌加入到对应人的手牌列表中}}// 打印每个人摸到的牌System.out.println("第1个人摸到的牌:" + hand1);System.out.println("第2个人摸到的牌:" + hand2);System.out.println("第3个人摸到的牌:" + hand3);}
开始摸牌,用嵌套循环去模拟分发,这里要明白为啥每次只remove(0),这是因为存储牌的也是是基于ArrayList的List,每次移除第一个元素,后续的元素会自动补上,这样一来,每次遍历,下标为0的元素就是原来的下一张牌,就很好地模拟了实际的摸牌体验,
当然,循环停止后,也可以打印剩下的牌
System.out.println("剩余的牌");//显示剩余的牌System.out.println(cardList);
最后在创建一个测试类来看看效果是否符合预期
import java.util.List;public class demo {public static void main(String[] args) {Cards cards=new Cards();List<Card> cardList=cards.buyCards();System.out.println("刚开始的牌"+cardList);cards.shuffle(cardList);System.out.println("洗牌之后"+cardList);cards.drawCard(cardList);//摸牌}
}
最后的效果便是这般
说到这里,简单的洗牌游戏就被成功实现啦,如果感觉文章对你有所帮助的话,还请点点赞~
期待我们下次相会😉
相关文章:
基于ArrayList实现简单洗牌
前言 在之前的那篇文章中,我们已经认识了顺序表—>http://t.csdnimg.cn/2I3fE 基于此,便好理解ArrayList和后面的洗牌游戏了。 什么是ArrayList? ArrayList底层是一段连续的空间,并且可以动态扩容,是一个动态类型的顺序表&…...
Paddle实现人脸对比
人脸对比 人脸对比,顾名思义,就是对比两个人脸的相似度。本文将用Paddle实现这一功能。 PS:作者肝了整整3天才稍微搞明白实现方法 数据集准备 这里使用百度AI Studio的开源数据集: 人脸数据_数据集-飞桨AI Studio星河社区 (b…...
挖一挖:PostgreSQL Java里的double类型存储到varchar精度丢失问题
前言 大概故事是这样的,PostgreSQL数据库,表结构: create table t1(a varchar);然后使用标准的Java jdbc去插入数据,其基本代码如下: import java.sql.*; public class PgDoubleTest {public static void main(Stri…...
函数对象基本使用
一、函数对象概念 1.重载函数调用操作符的类,其对象常称为函数对象 2.函数对象使用重载的()时,行为类似函数调用,也叫仿函数 本质: 函数对象(仿函数)是一个类,不是一个函数 二、函数对象使用 特点: 函…...
浅谈HTTP
浅谈HTTP 要通过netty实现HTTP服务器(或者客户端),首先你要了解HTTP协议。 HTTP在客户端 - 服务器计算模型中用作请求 - 响应协议。 例如,web浏览器可以是客户端,并且在托管网站的计算机上运行的应用程序可以是服务器。 客户端向服务器提交…...
HarmonyOS NEXT应用开发之@Provide装饰器和\@Consume装饰器:与后代组件双向同步
Provide和Consume,应用于与后代组件的双向数据同步,应用于状态数据在多个层级之间传递的场景。不同于上文提到的父子组件之间通过命名参数机制传递,Provide和Consume摆脱参数传递机制的束缚,实现跨层级传递。 其中Provide装饰的变…...
Docker 安装 | 部署MySQL 8.x 初始设置
1、准备工作 如果不想看前面的废话请直接右边目录跳到 运行容器 处 默认你已经有 docker 环境。 Windows 推荐 Docker Desktop (下载地址)并基于 WSL2 运行 Docker 环境 mac 推荐 Orbstack (下载地址)(这个很节省资源&…...
linux三剑客之流编辑器sed
sed(stream editor)是Linux和Unix系统中一个非常强大的文本处理工具。它主要用于对文本数据进行过滤和转换。sed 可以在不打开文件的情况下,直接对输入流进行操作,并且可以将结果输出到标准输出或文件。 基本语法: s…...
【Android Studio】上位机-安卓系统手机-蓝牙调试助手
【Android Studio】上位机-安卓系统手机-蓝牙调试助手 文章目录 前言AS官网一、手机配置二、移植工程三、配置四、BUG五、Java语言总结 前言 提示:以下是本篇文章正文内容,下面案例可供参考 AS官网 AS官网 一、手机配置 Android Studio 下真机调试 …...
怎样把学浪购买的课程下载下来
如何把学浪已购买的课程下载下来?这里就教大家一个方法,利用一个工具轻轻松松把视频下载下来 这个工具我打包成压缩包了,有需要的自己取一下 链接:https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码:kqvj --来自百度网盘超级会员V1…...
SD-WAN如何解决更有性价比地跨境网络问题
云桥通SD-WAN利用智能路由和负载均衡技术,优化数据传输路径,提高网络性能和可靠性。这意味着数据在跨国传输时可以更快到达目的地,减少延迟和丢包率。跨境SD-WAN提高了网络连接速度和质量,使用户能够更快地访问跨国业务所需的资源…...
第15章 File类与IO流
一 java.io.File类的使用 1.1 概述 File类及本章下的各种流,都定义在java.io包下。一个File对象代表硬盘或网络中可能存在的一个文件或者文件目录(俗称文件夹),与平台无关。(体会万事万物皆对象)File 能新…...
C语言基础语法-教案16(从小白到劝退之结构体初阶)
最近给大家争取到一个 深夜福利 保证你在深夜手机刷到 嘎嘎香~ 那就是 大流量卡 缺点:月租太便宜 185GB~ 100分钟通话时长~ 长期套餐~ 畅想自由的气息 流量自由的同时还拥有超长通话,而且免费领取。 名额有限,咱们废话不多说直接上…...
Linux:ip和ip协议的初步认识
文章目录 ip协议基本认识ip协议的报头网段划分ip的类型划分 ip协议基本认识 前面对于TCP的内容已经基本结束了,那么这也就意味着在传输层也已经结束了,那么下一步要进入的是的是网络层,网络层中也有很多种协议,这里主要进行解析的…...
Android12 简单的共享内存驱动实现 参考Ashmem
Android12 共享内存驱动实现 SOC:RK3568 system:Android12 概述: 1. 概述 Ashmem(Anonymous Shared Memory,Android 匿名共享内存),它基于 mmap 系统调用,可以让不同进程将同一段…...
物理安全和逻辑安全在信息安全中的重要作用
在信息时代,信息安全已经成为企业和个人不可或缺的重要组成部分。物理安全和逻辑安全作为信息安全的两大支柱,发挥着至关重要的作用。 什么是物理安全和逻辑安全? 物理安全是指通过技术手段,对计算机设备、网络设备、数据中心等…...
每日一题 --- 滑动窗口最大值[力扣][Go]
滑动窗口最大值 题目:239. 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1࿱…...
TensorBoard可视化+Confustion Matrix Drawing
for later~ 代码阅读 1. 加载trainset import argparse import logging import os import numpy as npimport torch from torch import distributed from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriterfrom backbones import get_…...
012——LED模块驱动开发(基于I.MX6uLL)
目录 一、 硬件原理图 二、 驱动程序 三、 应用程序 四、 Makefile 五、操作 一、 硬件原理图 又是非常经典的点灯环节 ,每次学新语言第一步都是hello world,拿到新板子或者学习新的操作系统,第一步就是点灯。 LED 的驱动方式࿰…...
基于springboot实现房屋租赁管理系统项目【项目源码+论文说明】计算机毕业设计
基于springboot实现房屋租赁系统演示 摘要 房屋是人类生活栖息的重要场所,随着城市中的流动人口的增多,人们对房屋租赁需求越来越高,为满足用户查询房屋、预约看房、房屋租赁的需求,特开发了本基于Spring Boot的房屋租赁系统。 …...
168.乐理基础-中古调式概述
如果到这五线谱还没记住还不认识的话去看102.五线谱-高音谱号与103.五线谱-低音谱号这两个里,这里面有五线谱对应的音名,对比着看 如果不认识调号去看112.五线谱的调号(一)、113.五线谱的调号(二)、114.快…...
【项目实战】【Docker】【Git】【Linux】部署V2rayA项目
今天着手了一个全新领域的项目,从完全没有头绪到成功运行,记录一下具体的部署流程 github项目链接V2rayA 一开始拿到以后完全没有抓手,去阅读了一下他的帮助文档 写着能用docker运行,就去下载了一个Docker配置了一下 拉取代码到…...
mac 切换 jdk
查看 mac 上都有哪些版本 /usr/libexec/java_home -V看准版本切换 按前缀切换 比如 export JAVA_HOME/usr/libexec/java_home -v 1.8这样会随机一个 1.8 的 如果想再确定一个比如 openjdk export JAVA_HOME/usr/libexec/java_home -v 1.8.0_292这个方式是临时的,…...
MD5加密返回32位密文字符串
前言: 项目中需要调用其他系统的 api 接口,接口使用的是按一定规则生成 MD5 密文作为签名来进行身份验证,本文仅记录 32 位 MD5 密文的生成方式,仅供参考。 什么是MD5 加密? MD5 加密是一种加密算法,MD5…...
npm常用命令技巧
NPM (Node Package Manager) 是 JavaScript 的包管理工具,广泛用于管理项目中的依赖。无论是前端项目还是Node.js后端项目,NPM 都扮演着重要的角色。本文将介绍 NPM 中常用的几个命令,并提供相应的代码示例。 1. 初始化项目:npm …...
intellij idea 使用git撤销(取消)commit
git撤销(取消) 未 push的 commit Git,选择分支后,右键 Undo Commit ,会把这个 commit 撤销。 git撤销(取消) 已经 push 的 commit 备份分支内容: 选中分支, 新建 分支,避免后续因为操作不当,导…...
【计算机网络】四层负载均衡和七层负载均衡
前言 1、分层方式 首先我们知道,在计算机网络中,常用的协议分层方式:OSI和TCP/IP,以及实际生产中使用的协议划分方式。 在OSI中,各层的职责如下: 应用层:对软件提供接口以使程序能使用网络服…...
IP-guard WebServer 任意文件读取漏洞复现
0x01 产品简介 IP-guard是由溢信科技股份有限公司开发的一款终端安全管理软件,旨在帮助企业保护终端设备安全、数据安全、管理网络使用和简化IT系统管理。 0x02 漏洞概述 由于IP-guard WebServer /ipg/static/appr/lib/flexpaper/php/view.php接口处未对用户输入的数据进行严…...
【IoTDB 线上小课 01】我们聊聊“金三银四”下的开源
关于 IoTDB,关于物联网,关于时序数据库,关于开源...你是否仍有很多疑问? 除了自己钻研文档,群里与各位“大佬”的沟通,你是否还希望能够有个学习“捷径”? 天谋科技发起社区小伙伴,正…...
2024053期传足14场胜负前瞻
2024053期售止时间为4月6日(周六)21点00分,敬请留意: 本期深盘多,1.5以下赔率1场,1.5-2.0赔率8场,其他场次是平半盘、平盘。本期14场难度中等。以下为基础盘前瞻,大家可根据自身判断…...
导航网址网站怎么做/沈阳关键词seo排名
一、Eureka特性1.当注册中心挂了,客户端之间依然可以通过原有的注册表进行调用;注册中心重启后,客户端会继续注册进来 2.当服务提供者挂了,在关闭自我保护的情况下,注册中心在规定时间(默认是60s࿰…...
找老外做网站可靠吗/cms建站系统
f{} Python3.6及以上版本才有,Python3.5及以下版本会出错。 %s%() 常用格式 {}.format() {}里面可以带数字也可以不带数字,带数字编号可以调换输出顺序,还可以带关键字。 device torch.device(fcuda:{opt.local_rank}) #python3.6 device …...
济南住房与城乡建设局网站/西安seo网站关键词
ASP操作数据库的类 作者:coldstone 时间: 2007-11-12 文档类型:原创 来自:蓝色理想 第 1 页 ASP操作数据库的类 [1] 第 2 页 ASP操作数据库的类 [2] 第 3 页 ASP操作数据库的类 [3] 第 4 页 ASP操作数据库的类 [4] 对于ASP…...
wordpress漏洞webshell/登封网站建设公司
网友解答:大家好我是大明 今天就WIN7开机慢的这一问题给大家做一分享 小编总结了两种处理这问题的方法。方法一:开始-运行输入msconfig命令选择启动关闭无用的加载项如下图所示:之后确定重启就OK啦!方法二:通过开始-运行 输入&…...
大兴做网站公司/危机公关处理五大原则
出租司机给我上的MBA课 from http://blog.csdn.net/psyl/archive/2006/03/17/627496.aspx我要从徐家汇赶去机场,于是匆匆结束了一个会议,在美罗大厦前搜索出租车。一辆大众发现了我,非常专业的、径直的停在我的面前。这一停,于是有…...
长沙手机网站建设哪些内容/seo收录查询工具
第1章作业: 1.简述你是如何理解数据库系统的三级模式(模式、外模式、内模式)之间的关系的。 答:.数据库的三级模式是数据库在三个级别上的抽象,用户级对应外模式,概念级对应概念模式,物理级对…...