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

    }

运行结果

二. 杨辉三角

相关推荐
花开富贵ii1 小时前
代码随想录算法训练营四十三天|图论part01
java·数据结构·算法·深度优先·图论
布朗克1682 小时前
Java 10 新特性及具体应用
java·开发语言·新特性·java10
code小毛孩2 小时前
leetcode hot100数组:缺失的第一个正数
数据结构·算法·leetcode
ZZHow10245 小时前
JavaWeb开发_Day05
java·笔记·web
CHEN5_025 小时前
【Java虚拟机】垃圾回收机制
java·开发语言·jvm
Warren985 小时前
Lua 脚本在 Redis 中的应用
java·前端·网络·vue.js·redis·junit·lua
HalvmånEver5 小时前
在 C++ :x86(32 位)和 x64(64 位)的不同
开发语言·c++·学习
amy_jork7 小时前
npm删除包
开发语言·javascript·ecmascript
浪成电火花8 小时前
(deepseek!)deepspeed中C++关联部分
开发语言·c++
茉莉玫瑰花茶8 小时前
Qt 常用控件 - 9
开发语言·qt