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

    }

运行结果

二. 杨辉三角

相关推荐
h汉堡36 分钟前
C++入门基础
开发语言·c++·学习
橘猫云计算机设计36 分钟前
基于Springboot的自习室预约系统的设计与实现(源码+lw+部署文档+讲解),源码可白嫖!
java·spring boot·后端·毕业设计
HtwHUAT1 小时前
实验四 Java图形界面与事件处理
开发语言·前端·python
鄃鳕1 小时前
QSS【QT】
开发语言·qt
汤姆_5111 小时前
【c语言】深度理解指针4——sizeof和strlen
c语言·开发语言
秋书一叶1 小时前
SpringBoot项目打包为window安装包
java·spring boot·后端
碎梦归途1 小时前
23种设计模式-结构型模式之外观模式(Java版本)
java·开发语言·jvm·设计模式·intellij-idea·外观模式
极客先躯2 小时前
高级java每日一道面试题-2025年4月13日-微服务篇[Nacos篇]-Nacos如何处理网络分区情况下的服务可用性问题?
java·服务器·网络·微服务·nacos·高级面试
_GR2 小时前
2025年蓝桥杯第十六届C&C++大学B组真题及代码
c语言·数据结构·c++·算法·贪心算法·蓝桥杯·动态规划
muyouking112 小时前
4.Rust+Axum Tower 中间件实战:从集成到自定义
开发语言·中间件·rust