简单的洗牌(数据结构系列4)

news2024/11/24 11:43:02

目录

前言:

1.思想

1.1基本框架的搭建

1.2洗牌操作

1.3揭牌 

2.代码+运行结果截图

结束语:


前言:

在上一次的博客中小编与大家分享了ArrayList的模拟实现和一些具体的使用方法,那么接下来我们通过一个简单的洗牌练习来巩固一下我们对ArrayList的知识。

1.思想

1.1基本框架的搭建

我们都知道我们除了大王二王几乎每张牌都有特点,都是由牌数和花色构成的,所以我们先来搭建出一个Poker类。

代码如下所示:

public class Poker {
    private String suit;//花色
    private int rank;//数字

    public Poker(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "{" + suit + " " + rank + "}";
    }
}

那么接下来我们就需要去进行将所有的牌进行玩牌,那么我们就需要创建一个Game类来进行玩游戏的操作,但是在玩之前我们需要去买回来一副扑克牌,其中我们就可以应用到我们之前学习的ArrayList的知识了,代码如下所示:

import java.util.ArrayList;
import java.util.List;

public class Game {
    private static final String[] suits = {"♥","♣","♦","♠"};
    public List<Poker> buyPoker() {
        List<Poker> pokers = new ArrayList<>();
        //四种花色
        for (int i = 0; i < 4; i++) {
            //1~13的数字
            for (int j = 1; j <= 13; j++) {
                //生成一个扑克牌,每个都是有花色和数字组成
                //方法一:
//                String suit =  suits[i];
//                int rank = j;
//                Poker poker = new Poker(suit,rank);
                //方法二:
                Poker poker = new Poker(suits[i], j);//实例化出一个扑克
                pokers.add(poker);//将该扑克放入到数组内
            }
        }
        return pokers;
    }
}

 在最后我们需要一个测试类,简单测试一下我们买回来的扑克牌是否完整,代码如下所示:

import java.util.List;

public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        List<Poker> pokers = game.buyPoker();
        System.out.println(pokers);
    }
}

结果如下所示:

 

1.2洗牌操作

洗牌就相当于是打乱51个数组内的数字,那么我们就会想到先遍历数组然后我们再随机让系统随机生成一个下标让两者进行交换,那么我们究竟是让数组的下标从前往后走呢,还是从后往前走呢?

我们采用的是后者,让数组的下标从后往前走,然后再在0~i之建随机生成一个下标,让两者进行交换,这样就达到了洗牌的目的。

代码如下所示(下面的代码是属于Game模块里面的代码):

public void shuffle(List<Poker> pokers) {
        for (int i = pokers.size() - 1; i > 0 ; i--) {
            Random random = new Random();
            int index = random.nextInt(i);//在0~i之间随机生成一个下标
            swap(pokers,i,index);//进行交换
        }
    }
    private void swap(List<Poker> pokers, int i, int j) {
        Poker tmp = pokers.get(i);
        pokers.set(i,pokers.get(j));
        pokers.set(j,tmp);
    }

测试代码如下所示:

import java.util.List;

public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        List<Poker> pokers = game.buyPoker();
        System.out.println(pokers);
        System.out.println("洗牌:");
        game.shuffle(pokers);//把买回来的牌直接放进去,进行洗牌
        System.out.println(pokers);
    }
}

 

洗牌测试结果截图:
  

1.3揭牌 

揭牌规则:三个人每个人轮流抓五张牌

逻辑就是在pokers中一个一个删牌,每次都删除pokers这个list的0下标。三个人揭的牌都每次都放在自己的数组中。

Game类中的代码:

//揭牌
    public List<List<Poker>> game(List<Poker> pokers) {
        //靠二维数组;来关联三个人关系
        List<List<Poker>> hand = new ArrayList<>();
        //创建出三个人的数组
        List<Poker> hand1 = new ArrayList<>();
        List<Poker> hand2 = new ArrayList<>();
        List<Poker> hand3 = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        //最外层循环 控制轮数
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                Poker removePoker =  pokers.remove(0);//每次揭的都是0下标的值
                hand.get(j).add(removePoker);
            }
        }
        return hand;
    }


测试类中的代码:

import java.util.List;

public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        List<Poker> pokers = game.buyPoker();
        System.out.println(pokers);
        //洗牌
        System.out.println("洗牌:");
        game.shuffle(pokers);//把买回来的牌直接放进去,进行洗牌
        System.out.println(pokers);
        //揭牌
        System.out.println("揭牌:");
        List<List<Poker>> hand = game.game(pokers);
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第" + (i + 1) + "个牌" + hand.get(i));
        }
        System.out.println("剩下的牌:");
        System.out.println(pokers);
    }
}

测试结果截图:

提示:剩下的牌在代码中没有显示全。

2.代码+运行结果截图

Game代码:

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Game {
    private static final String[] suits = {"♥","♣","♦","♠"};
    public List<Poker> buyPoker() {
        List<Poker> pokers = new ArrayList<>();
        //四种花色
        for (int i = 0; i < 4; i++) {
            //1~13的数字
            for (int j = 1; j <= 13; j++) {
                //生成一个扑克牌,每个都是有花色和数字组成
                //方法一:
//                String suit =  suits[i];
//                int rank = j;
//                Poker poker = new Poker(suit,rank);
                //方法二:
                Poker poker = new Poker(suits[i], j);//实例化出一个扑克
                pokers.add(poker);//将该扑克放入到数组内
            }
        }
        return pokers;
    }
    //洗牌
    public void shuffle(List<Poker> pokers) {
        for (int i = pokers.size() - 1; i > 0 ; i--) {
            Random random = new Random();
            int index = random.nextInt(i);//在0~i之间随机生成一个下标
            swap(pokers,i,index);//进行交换
        }
    }
    private void swap(List<Poker> pokers, int i, int j) {
        Poker tmp = pokers.get(i);
        pokers.set(i,pokers.get(j));
        pokers.set(j,tmp);
    }
    //揭牌
    public List<List<Poker>> game(List<Poker> pokers) {
        //靠二维数组;来关联三个人关系
        List<List<Poker>> hand = new ArrayList<>();
        //创建出三个人的数组
        List<Poker> hand1 = new ArrayList<>();
        List<Poker> hand2 = new ArrayList<>();
        List<Poker> hand3 = new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        //最外层循环 控制轮数
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                Poker removePoker =  pokers.remove(0);//每次揭的都是0下标的值
                hand.get(j).add(removePoker);
            }
        }
        return hand;
    }
}

Poker代码:

public class Poker {
    private String suit;//花色
    private int rank;//数字

    public Poker(String suit, int rank) {
        this.suit = suit;
        this.rank = rank;
    }

    public String getSuit() {
        return suit;
    }

    public void setSuit(String suit) {
        this.suit = suit;
    }

    public int getRank() {
        return rank;
    }

    public void setRank(int rank) {
        this.rank = rank;
    }

    @Override
    public String toString() {
        return "{" + suit + " " + rank + "}";
    }
}

Test代码:

import java.util.List;

public class Test {
    public static void main(String[] args) {
        Game game = new Game();
        List<Poker> pokers = game.buyPoker();
        System.out.println(pokers);
        //洗牌
        System.out.println("洗牌:");
        game.shuffle(pokers);//把买回来的牌直接放进去,进行洗牌
        System.out.println(pokers);
        //揭牌
        System.out.println("揭牌:");
        List<List<Poker>> hand = game.game(pokers);
        for (int i = 0; i < hand.size(); i++) {
            System.out.println("第" + (i + 1) + "个牌" + hand.get(i));
        }
        System.out.println("剩下的牌:");
        System.out.println(pokers);
    }
}

运行结果截图:

提示:由于后面的屏幕有限,所以截图没有截全。 

结束语:

好啦!这次小编就与大家发享到这里了,主要是在上一次的ArrayList的基础知识上进行了简单了一个练习,后期小编还会继续分享的,大家记得查看哦!大家继续跟紧小编的步伐一起往下走吧!!!希望对大家有所帮助,想要学习的同学记得关注小编和小编一起学习吧!如果文章中有任何错误也欢迎各位大佬及时为小编指点迷津(在此小编先谢过各位大佬啦!)

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

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

相关文章

Java创建枚举类并定义使用枚举项

前言 在项目开发中&#xff0c;常量和枚举都是我们经常使用的技巧。都是为了提高开发效率。常量我们一般都会创建一个常量类&#xff0c;里面放一些经常使用的变量&#xff0c;例如&#xff1a; 枚举的定义和使用相比于常量&#xff0c;也是有异曲同工之巧的&#xff0c;下面就…

梅开二度的 axios 源码阅读,三千字详细分享功能函数,帮助扩展开发思维

前言 第一遍看 axios 源码&#xff0c;更多的是带着日常开发的习惯&#xff0c;时不时产生出点联想。 第二遍再看 axios 源码&#xff0c;目标明确&#xff0c;就是奔着函数来的。 当有了明确清晰的目标&#xff0c;阅读速度上来了&#xff0c;思绪也转的飞快。 按图索骥&a…

day 15 第六章二叉树

层序遍历 102.二叉树的层序遍历107.二叉树的层次遍历II199.二叉树的右视图637.二叉树的层平均值429.N叉树的层序遍历515.在每个树行中找最大值116.填充每个节点的下一个右侧节点指针117.填充每个节点的下一个右侧节点指针II104.二叉树的最大深度111.二叉树的最小深度 226.翻转二…

速腾rshelios 5515惯导时间同步

目前接触过两种雷达和惯导同步的方式&#xff1a; 1.惯导输出gprms和pps信号给米文系统&#xff0c;雷达驱动从系统里读取时间。 2.惯导输出gprms和pps信号给雷达&#xff0c;雷达驱动从雷达数据读取时间。 GPRMS和PPS的内容参考&#xff1a;STM32模拟GPS输出PPS、GPRMC与VLP…

多传感器融合定位九-基于滤波的融合方法Ⅰ其一

多传感器融合定位九-基于滤波的融合方法Ⅰ其一1. 滤波器的作用2. 概率基础知识2.1 概率、概率密度2.2 联合概率密度2.3 条件概率密度2.4 贝叶斯公式2.5 贝叶斯推断2.6 高斯概率密度函数2.7 联合高斯概率密度函数2.8 高斯随机变量的线性分布1. 滤波器的作用 滤波器的本质&#…

编译与链接------《程序员的自我修养》

本篇整理于《程序员的自我修养》一书中编译与链接相关知识&#xff0c;整理的目的是为了更加深入的了解编译于链接的更多底层知识&#xff0c;面对程序运行时种种性能瓶颈我们束手无策。我们看到的是这些问题的现象,但是却很难看清本质&#xff0c;所有这些问题的本质就是软件运…

Allegro如何使用Vertext命令修改丝印线段的形状操作指导

Allegro如何使用Vertext命令修改丝印线段的形状操作指导 在用Allegro画丝印线段的时候,如果画了一段不是自己需要形状的线段,无需删除重画,可以用Vertext命令直接编辑 如下图 修改前 修改后 具体操作如下 选择Edit

Java笔记-JUC基础

1、什么是JUC JUC指的是java.util三个并发编程工具包 java.util.concurrentjava.util.concurrent.atomicjava.util.concurrent.locks 2、线程的几种状态 public enum State{NEW,//新建RUNNABLE,//准备就绪&#xff0c;等待资源BLOCKED,//阻塞WAITING,//一直等待TIMED_WAITI…

vue脚手架 element-ui spring boot 实现图片上传阿里云 并保存到数据库

一.阿里云 注册登陆就不讲了&#xff0c;登陆进去后如下操作 1. 进入对象存储OSS 创建一个新的Bucket 随后点击新建的bucket 2.去访问RAM 前往RAM控制台 3.去创建用户 4.创建密匙 5.随后返回RAM控制台 给用户增加权限&#xff0c;文件上传所需权限&#xff0c;需要带含有…

LeetCode——1797. 设计一个验证系统

一、题目 你需要设计一个包含验证码的验证系统。每一次验证中&#xff0c;用户会收到一个新的验证码&#xff0c;这个验证码在 currentTime 时刻之后 timeToLive 秒过期。如果验证码被更新了&#xff0c;那么它会在 currentTime &#xff08;可能与之前的 currentTime 不同&am…

Java IO模型详解

文章目录Java IO模型详解一、I/O的定义1、计算机结构的视角2、应用程序的视角二、Java 中3种常见的 I/O 模型1、同步阻塞 I/O&#xff08;BIO&#xff09;2、同步非阻塞 I/O&#xff08;NIO&#xff09;★ I/O 多路复用模型3、异步非阻塞 I/O&#xff08;AIO&#xff09;Java I…

Flutter 小技巧之 3.7 更灵活的编译变量支持

今天我们聊个简单的知识点&#xff0c;在 Flutter 3.7 的 release-notes 里&#xff0c;有一个没有出现在 announcement 说明上的 change log &#xff0c;可能对于 Flutter 团队来说这个功能并不是特别重要&#xff0c;但是对于我个人而言&#xff0c;这是一个十分重要的能力补…

什么是模板方法模式?

在面向对象程序设计过程中&#xff0c;程序员常常会遇到这种情况&#xff1a;设计一个系统时知道了算法所需的关键步骤&#xff0c;而且确定了这些步骤的执行顺序&#xff0c;但某些步骤的具体实现还未知&#xff0c;或者说某些步骤的实现与具体的环境相关。例如&#xff0c;去…

阿里云国际服务器ECS特性与优势

阿里云国际服务器的 ECS 作为一种安全、可靠、灵活、可扩展的云计算服务&#xff0c;不仅可以减少运行和维护&#xff0c;而且可以提高运行和维护效率&#xff0c;使用户关注核心业务的创新。 阿里云国际服务器ECS优势一&#xff1a;产品丰富 阿里云国际云服务器 ECS 可以提供…

《MySql学习》 SQL 语句的更新过程

《MySql学习》 SQL 语句的更新过程 一.SQL查询语句的执行过程 上一篇博文记录了SQL查询语句的执行过程&#xff0c;首先客户端通过TCP三次握手与Server层的连接器建立连接&#xff08;短连接与长链接&#xff09;&#xff0c;缓存权限。然后去查询缓存&#xff08;8.0后移除&…

联想服务器双品牌的思考:融合化、场景化、订阅化、绿色化,打造全栈新算力基础设施

联想集团执行副总裁兼中国区总裁刘军&#xff1a;智能化转型是中国企业未来十年穿越经济周期的利器&#xff0c;智能化生产力水平决定了企业发展的速度与高度。 联想创新性提出融合化、场景化、订阅化及绿色化的“四维算力”&#xff0c;致力于成为中国领先的智能IT基础设施提供…

微服务--Feign学习

Feign远程调用&#xff1a; RestTemplate发起远程调用的代码&#xff1a; 存在下面的问题 代码可读性差&#xff0c;编程体验不统一参数复杂URL难以维护 Feign的介绍&#xff1a;Feign是一个声明式的http客户端&#xff0c;官方地址&#xff1a;https://github.com/OpenFeign/…

论文文献引用规范和标准(国标GBT7714)@endnote国标样式

文章目录论文文献引用规范和标准&#xff08;国标GBT7714&#xff09;国标GBT7714-2015endnote stylerefs简述国标GBT7714条目的组织格式Noteword中的文献交叉引用超链接文献引用示例endNote资源和基本使用endnote或其他文献引用工具下载word中的其他引文技巧知网国标格式引文引…

谈谈Java Optional的坑

开端&#xff1a; 大家好&#xff0c;我是老白。昨天朋友提出的java8后出来的自带的对象判定方式Optional.ofNullable(),后来查询了一些资料和自己试验了一些demo资料&#xff0c;在这里记录分享个大家 作用&#xff1a;判断对象是否为空&#xff0c;是则重新创建一个新对象&…

ABAP 搜索帮助带出多个字段描述 更新屏幕字段

文章目录需求解析1-DYNP_GET_STEPL2-F4IF_INT_TABLE_VALUE_REQUEST3-获取返回值4-把相应字段更新到内表5-DYNP_VALUES_UPDATE代码需求 如图,当我点击责任工序的搜说帮助时, 同时会把责任人员的描述带出来. 解析 1-DYNP_GET_STEPL 这个方法就是获取当前的循环步骤 2-F4IF_I…