【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);

    }

运行结果

二. 杨辉三角

相关推荐
泡海椒14 分钟前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
Bs_MoneyMagnet3 小时前
基于springboot+vue的滑雪场票务与装备租赁系统的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring·毕业设计·计算机毕业设计
野生技术架构师9 小时前
2026 Java 面试全套总结,八股 + 场景 + AI 相关面试考点
java·人工智能·面试
香吧香9 小时前
java服务异常日志只打印异常类型,没有堆栈定位分析
java·jvm·异常
qq_25183645710 小时前
AI 疾病自查功能SpringbootAI项目实战 · 技术实现文档
java·ai·ai编程
mmmmath_310 小时前
LeetCode.541.反转字符串II
数据结构·算法·leetcode
逆境不可逃10 小时前
Pi Agent 学习笔记:对话太长以后,如何压缩上下文
java
MetaLite10 小时前
JDK 8~26 核心特性一览:从 Stream 到 Scoped Values
java
wno70411 小时前
Spring Boot WebFlux增删改查
java·spring boot·后端
君顾111 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房