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

    }

运行结果

二. 杨辉三角

相关推荐
415411几秒前
MyBatis-Plus + PostGIS 实战(1.1):Geometry 字段在 Swagger 中的优雅展示
java·mybatis·postgis
m0_738120721 分钟前
PHP代码审计基础——面向对象(四)
android·开发语言·网络·安全·github·php
2601_963771378 分钟前
10 Best PHP Media CMS and Scripts for Web Creators in 2026
开发语言·前端·php
阿里嘎多学长25 分钟前
2026-07-09 GitHub 热点项目精选
开发语言·程序员·github·代码托管
极客先躯25 分钟前
高级java每日一道面试题-2026年04月05日-实战篇[Docker]-如何排查容器 OOM 的问题?
java·运维·docker·容器·内存溢出·高级面试
带娃的IT创业者28 分钟前
监控并非安全:当隐私成为技术的祭品
java·开发语言·安全·数据安全·监控·隐私保护·加密技术
玖玥拾1 小时前
C# 语言进阶(十四)Unity UI界面开发 + 网络消息联动
服务器·开发语言·网络·ui·unity·c#·游戏引擎
叩码以求索1 小时前
使用next数组加速匹配过程
java·数据结构·算法
aaPIXa6221 小时前
C++ 质量前置检查:clang-format 与 clang-tidy 实践指南
开发语言·c++