【JAVA数据结构】简单洗牌算法——ArrayList(顺序表)使用实例

详细知识讲解请跳转:【JAVA数据结构】(ArrayList)顺序表-CSDN博客

一. 简单的洗牌算法

特殊知识须记:

java 复制代码
List < List<E> >

该语法情况比较特殊,相当于一个"二维数组"存着一个个线性表的结构,如图

这是用于洗牌中三个人的牌分配

基本流程:

我们想实现的是一副牌(去鬼牌),三个人玩,每个人开始五张牌,轮流摸。

以上述图片为例:

步骤一:设置牌类

先定义一个Card牌类,存放数字和花色

java 复制代码
public class Card {
    public int rank;//数字
    public String suit;//花色

    //构造方法
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    //重写toString,方便更好查看打印的数据
    @Override
    public String toString() {
        return String.format("[%s,%d]",suit,rank);
    }
    
}

步骤二:设置操作牌的类,实现买牌,洗牌,发牌操作:

买牌
java 复制代码
public class CardDemo {
    //固定一下花色
    public static final String[] SUITS = {"♠", "♥", "♣", "♦"};

    //买一副顺序完整的新牌
    public static List<Card> NewDeck(){
        //先设置好 52张空牌
        //设置大小为52的动态顺序表,存放类型为Card牌类
        List<Card> Deck = new ArrayList<>(52);

        //再将4个花色和13种数字的数据依次填到牌里
        for (int i = 0; i < SUITS.length; i++) {
            for (int j = 0; j <= 13 ; j++) {

                //分别用数值接收数字和花色
                int rank = j;
                String suit = SUITS[i];
                //将得到的数据存到一张卡牌上
                Card card = new Card(rank,suit);

                //在空牌添加一组卡牌数据
                Deck.add(card);
            }
        }
        //注意返回值!
        return Deck;
    }
洗牌
java 复制代码
//随机洗牌
    //随机交换牌
    public static void swap(List<Card> cards,int i ,int r){
        Card tmp = cards.get(i);
        //i下标的值设置为r下标所对应的数
        cards.set(i,cards.get(r));
        //同上,r下标的值设置为 i下标所对应的数
        cards.set(r,tmp);
    }
    public static void Shuffle (List<Card> deck){
        // i是顺序表的数所对应的下标
        //从后开始随机遍历(从i=0开始随机范围无法达到整个数组)
        for (int i = deck.size()-1; i > 0; i--) {
            Random random = new Random();

            //随机在0~i以内的下标值
            int r = random.nextInt(i);

            //将随机的下标对应的数 和 i下标的数 交换位置
            swap(deck,i,r);
        }
    }
发牌
java 复制代码
    public static void main(String[] args) {
        //整理好新牌
        List<Card> New = NewDeck();
        System.out.println(New);

        //洗牌
        Shuffle(New);
        System.out.println(New);

        //发牌
        //三人轮流拿牌,一人五张
        List<List<Card>> hands = new ArrayList<>();
        //三个人各自手中的牌
        List<Card> hand1 = new ArrayList<>();
        List<Card> hand2 = new ArrayList<>();
        List<Card> hand3 = new ArrayList<>();
        hands.add(hand1);
        hands.add(hand2);
        hands.add(hand3);

        //每个人拿5张
        for (int i = 0; i < 5 ; i++) {
            //每次三个人每人拿一张牌
            for (int j = 0; j < 3; j++) {
                //每次拿掉第一张牌的数据
                Card card = New.remove(0);
                //将第一张牌数据给此时这个人手中
                hands.get(j).add(card);
            }
        }

        //打印分完牌之后每个人手中的牌
        System.out.println("第一个人:" + hands.get(0));
        System.out.println("第二个人:" + hands.get(1));
        System.out.println("第三个人:" + hands.get(2));
        System.out.println("剩下的牌:" + New);

    }

运行结果

二. 杨辉三角

相关推荐
Mr Aokey18 小时前
快速入门 Spring Boot 拦截器、统一响应格式和全局异常处理
java·开发语言·aop·拦截器
鬼蛟18 小时前
Spring_MVC
java·spring·mvc
瓦哥架构实战18 小时前
CentOS 7 编译安装 Python 3.9 解决 SSL 模块缺失问题
开发语言·python
敲上瘾18 小时前
位图与布隆过滤器:原理、实现与海量数据处理方案
大数据·数据结构·算法·位图·布隆过滤器
宵时待雨18 小时前
C++笔记归纳13:map & set
开发语言·数据结构·c++·笔记·算法
xiangpanf18 小时前
PHP与Vue:前后端技术深度对比
开发语言·vue.js·php
怀旧诚子19 小时前
timeshift之Fedora43设置,已在VM虚拟机验证,待真机验证。
java·服务器·数据库
1104.北光c°19 小时前
滑动窗口HotKey探测机制:让你的缓存TTL更智能
java·开发语言·笔记·程序人生·算法·滑动窗口·hotkey
for_ever_love__20 小时前
Objective-C学习 NSSet 和 NSMutableSet 功能详解
开发语言·学习·ios·objective-c
云原生指北1 天前
GitHub Copilot SDK 入门:五分钟构建你的第一个 AI Agent
java