news 2026/4/28 21:23:58

数据结构算法篇洗牌算法(特别有意思的算法)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
数据结构算法篇洗牌算法(特别有意思的算法)

一、算法结构

1.我们需要Card类来定义卡牌

卡牌需要一个rank(牌面数字),和一个suit(花色)

注意要记得写一个toString方法

public int rank;//牌面数字 public String suit;//花色 public Card(int rank, String suit) { this.rank = rank; this.suit = suit; } public String toString() { return String.format("[%s %d]",suit,rank); }

2.我们需要CardDemo类来定义方法(拿牌,洗牌,发牌)

上面我们已经把卡牌制作好了接下来来拿牌

2.1、拿牌也就是制作卡牌,我们以52张牌为例,

我们先定义一个数组来放花色

public static final String[] suits = {"♠","♣","♦","♥"};

这里制作牌有两种逻辑,一种是以一个数字来遍历4种花色,另一种是用一个花色来定义13个数字

我们采用第一种:

我们的对象的类型是Card ,所以这里是List<Card>,

public List<Card> buyCard(){ List<Card> cardList = new ArrayList<>(); for (int i = 1; i <=13 ; i++) {//把每个数字取出来进行花色遍历 for (int j = 0; j < 4; j++) { int rank =i;//拿数字 String suit = suits[j];//拿花色 Card card = new Card(rank,suit);//拿到属性制作出一张牌 cardList.add(card);//把牌放到数组中 } } return cardList;//形成一副52张牌的数组 }

2.2、洗牌

洗牌我们要用到Random类,用来生成随机数

public void shuffle(List<Card> cardList){ Random random = new Random(); for (int i = cardList.size()-1; i >0; i--) { int index = random.nextInt(i);//生成比i小的随机数 swap(cardList,index,i);//生成i下标的值和index下标的值交换,实现洗牌 } } private void swap(List<Card> cardList,int i , int j){ Card tmp = cardList.get(i); cardList.set(i,cardList.get(j)); cardList.set(j,tmp); }

2.3发牌

我们以三个人玩牌一人发五张牌为例:

public List<List<Card>> play(List<Card> cardList){ //定义三个对象来拿牌 List<Card> hand0 = new ArrayList<>(); List<Card> hand1 = new ArrayList<>(); List<Card> hand2 = new ArrayList<>(); //里面有两个数组所以我们使用二维数组List<List<Card>> List<List<Card>> hand = new ArrayList<>(); hand.add(hand0); hand.add(hand1); hand.add(hand2); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card card = cardList.remove(i);//每发一张就把最上面的牌给到另一个Card对象,并在原来的牌堆中删除 hand.get(j).add(card);//把牌挨个放回开始定义的三个对象的手中。 } } return hand;//返回二维数组。 }

二、总结

代码总结

Card类

package fisherYates; public class Card { //定义扑克牌 public int rank;//牌面数字 public String suit;//花色 public Card(int rank, String suit) { this.rank = rank; this.suit = suit; } public String toString() { return String.format("[%s %d]",suit,rank); } }

CardDemo类:

package fisherYates; import java.util.ArrayList; import java.util.List; import java.util.Random; public class CardDemo { public static final String[] suits = {"♠","♣","♦","♥"}; public List<Card> buyCard(){ List<Card> cardList = new ArrayList<>(); for (int i = 1; i <=13 ; i++) { for (int j = 0; j < 4; j++) { int rank =i; String suit = suits[j]; Card card = new Card(rank,suit); cardList.add(card); } } return cardList; } public void shuffle(List<Card> cardList){ Random random = new Random(); for (int i = cardList.size()-1; i >0; i--) { int index = random.nextInt(i); swap(cardList,index,i); } } private void swap(List<Card> cardList,int i , int j){ Card tmp = cardList.get(i); cardList.set(i,cardList.get(j)); cardList.set(j,tmp); } public List<List<Card>> play(List<Card> cardList){ List<Card> hand0 = new ArrayList<>(); List<Card> hand1 = new ArrayList<>(); List<Card> hand2 = new ArrayList<>(); List<List<Card>> hand = new ArrayList<>(); hand.add(hand0); hand.add(hand1); hand.add(hand2); for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { Card card = cardList.remove(i); hand.get(j).add(card); } } return hand; } }

写完这个算法对泛型,以及二维数组的使用,有新的认识,更能实际体验Java面向对象

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 5:39:34

论文生成源码排名:9大平台+开源开发工具

论文生成源码排名&#xff1a;9大平台开源开发工具 核心工具对比速览 工具名称 核心功能 处理时间 适配检测系统 特色优势 aibiye 论文降重与AIGC优化 15-30分钟 知网/维普/万方 语义级改写技术&#xff0c;保留学术逻辑 aicheck AIGC检测与降重 20分钟 知网/格子…

作者头像 李华
网站建设 2026/4/23 5:57:27

打造个人专属媒体王国:Jellyfin跨平台一键部署全攻略

还在为手机、电脑、电视上的媒体文件分散管理而头疼吗&#xff1f;想要随时随地欣赏自己的电影收藏却苦于找不到合适的解决方案&#xff1f;今天我要向你推荐一款完全免费、功能强大的个人媒体服务器软件——Jellyfin&#xff0c;让你轻松拥有属于自己的媒体王国&#xff01; 【…

作者头像 李华
网站建设 2026/4/23 22:59:42

文科通讯作者工具:8大平台+规范查询排名

文科通讯作者工具&#xff1a;8大平台规范查询排名 文科通讯作者工具&#xff1a;8大平台规范查询排名 核心工具对比速览 工具名称 核心功能 适用场景 效率评分 特色优势 aibiye 论文选题与框架生成 文科开题报告/文献综述 ★★★★☆ 文科专业适配度高 aicheck 开…

作者头像 李华
网站建设 2026/4/23 16:39:40

深蓝词库转换:跨平台输入法词库迁移终极指南

深蓝词库转换&#xff1a;跨平台输入法词库迁移终极指南 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 你是否曾经因为更换输入法而苦恼于词库无法迁移&#xff1f;…

作者头像 李华
网站建设 2026/4/21 18:09:13

离线安装.net3.5 sp

把提取的SXS放在C盘根目录&#xff0c;在管理员模式下powershell或者cmd复制下面脚本直接运行。 把sxs文件夹放到C盘根目录了&#xff0c;那么直接用如下代码即可 dism.exe /online /enable-feature /featurename:netfx3 /Source:C:\sxs 源网址在&#xff1a; 源网址在 Win10…

作者头像 李华
网站建设 2026/4/27 23:07:02

获奖名单来啦!Vibe Coze AI 挑战赛 -企业 AI 应用赛道圆满收官!

&#x1f4e3;经过激烈角逐&#xff0c;最终获奖结果正式揭晓&#xff01;感谢所有参赛者的精彩表现&#xff0c;也恭喜这些团队/个人突出重围&#xff0c;所有方案均聚焦企业真实痛点&#xff0c;用AI技术切实降低运营成本、提升决策效率&#xff0c;展现了AI赋能企业的实用价…

作者头像 李华