首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >ArrayList应用

ArrayList应用

作者头像
趙卋傑
发布2026-01-12 15:41:14
发布2026-01-12 15:41:14
950
举报

1.简单的洗牌算法

基本要求:

  1. 人数为3个人
  2. 没人轮流抽一张牌,抽五轮,也就是每人五张牌
  3. 去除大小王,一共52张牌,要求牌打乱顺序

思路:

  1. 创建Card对象,有花色和牌面值两个成员属性
  2. 生成一副扑克牌,四个花色分别生成1-13的牌面值
  3. 生成随机数,将最后一张牌与前面随机一张牌进行交换以此来完成洗牌操作
  4. 发到三个人的手里,每发一张牌就删除一个元素,删除的该元素记录到不同人的手里 

(1)定义每张扑克牌的属性

这里我们只需要创建一个对象Card,并定义出牌面值和花色两个成员属性; 写出该对象的构造方法和toString方法即可;

代码语言:javascript
复制
package demo1;

public class Card {
    public int rank;//牌面值
    public String suit;//花色

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public String toString() {
        return suit + rank;
    }
}

(2)生成一副扑克牌(不包含大小王)

  1. 先定义一个数组表示有四种花色;
  2. 如何生成一副牌?首先要明确是一个花色生成1-13牌面值的牌,所以此时要用到循环, 外循环循环4次也就是四个花色,内循环循环13次也就是牌的面值,一张花色生成完13张后再进行下一张,牌数的大小也就是不断变化的j值,花色也就是最初定义的suits,用不断变化的i来表示四个花色;然后我们通过实例化具有花色和牌面值两个属性的对象,这样就生成了四种不同花色不同牌面值的52张牌
  3. 生成的牌放在哪里?我们创建一个顺序表,其中列表中的元素都是Card类型或其子类型。创建好一张牌我们就追加到列表当中
代码语言:javascript
复制
    public static final String[] suits = {"♥","♠","♣","♦"};
    public List<Card> buyCard() {
        List<Card> cardList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 13; j++) {
                int rank = j;//牌数大小
                String suit = suits[i];
                Card card = new Card(rank,suit);
                cardList.add(card);//生成了一张牌追加到顺序表中
            }
        }
        return cardList;
    }

(3)洗牌

如何洗牌?顺序表的底层是一个数组,我们只需要将数组中最后一个数字与前面随机位置的数字进行交换即可;所以生成0~总牌数-1大小的随机数,直到只剩一个元素时,停止循环。

注:虽然顺序表的底层是一个数组,但在进行元素交换时不能直接使用[下标]的方式来进行交换,需要通过get方法获取,set方法更新来实现交换操作。

代码语言:javascript
复制
//洗牌操作
    //把牌传过来
    public void shuffle(List<Card> cardList) {
        Random random = new Random();
        for (int i = cardList.size()-1;i>0; i--) {
            int randIndex= random.nextInt(i);//生成0~i的随机数放入randIndex
            swap(cardList,i,randIndex);
        }
    }
    private void swap(List<Card> cardList,int i,int j) {
        Card tmp = cardList.get(i);
        cardList.set(i,cardList.get(i));
        cardList.set(j,tmp);
    }

(4)发牌

每个人抓的牌放到哪里?创建一个顺序表,每次抓到的牌add到对应人的手中 三个人怎么轮流抓取五张牌?通过双层for循环来实现,第一轮每人抓一张牌,进行五轮 怎么抓牌?通过remove来删除0下标的牌 抓的牌放到谁的手中?抓牌后添加到对应的人的手中,i就表示第几个人

此时相当于创建了一个二维数组,每个元素类型为List<Card>,表中存储对应的五张牌

代码语言:javascript
复制
//三个人, 每个人轮流抓5张牌
    public void drawCard(List<Card> cardList){
        List<Card> hand1=new ArrayList<>();
        List<Card> hand2=new ArrayList<>();
        List<Card> hand3=new ArrayList<>();

        List<List<Card>>hands=new ArrayList<>();
        hands.add(hand1);
        hands.add(hand2);
        hands.add(hand3);

        for (int i = 0; i < 5; i++) {//i代表5张牌
            for (int j = 0; j < 3; j++) {//j代表3个人
                Card card=cardList.remove(0);    //怎么抓牌? 每次删除0下标的牌
                hands.get(j).add(card);//hands.get(0)=hand1,以此类推

            }
        }
        System.out.println("第1个人的牌:"+hand1);
        System.out.println("第2个人的牌:"+hand2);
        System.out.println("第3个人的牌:"+hand3);
    }

 (5)整体代码

代码语言:javascript
复制
package demo1;

import java.util.List;

public class Test {
    public static void main(String[] args) {
        Cards cards=new Cards();

        List<Card> cardList=cards.buyCard();
        System.out.println("生成一副扑克牌:");
        System.out.println(cardList);

        cards.shuffle(cardList);
        System.out.println("洗牌后:");
        System.out.println(cardList);

        System.out.println("抓牌:");
        cards.drawCard(cardList);

        System.out.println("剩下的牌:");
        System.out.println(cardList);
    }
}

(6)测试

代码语言:javascript
复制
package demo1;

import java.util.List;

public class Test {
    public static void main(String[] args) {
        Cards cards=new Cards();

        List<Card> cardList=cards.buyCard();
        System.out.println("生成一副扑克牌:");
        System.out.println(cardList);

        cards.shuffle(cardList);
        System.out.println("洗牌后:");
        System.out.println(cardList);

        System.out.println("抓牌:");
        cards.drawCard(cardList);

        System.out.println("剩下的牌:");
        System.out.println(cardList);
    }
}

2.杨辉三角

思路:

代码语言:javascript
复制
List<List<Integer>>表示创建了一个顺序表,顺序表中的每一个元素都是存储整形的顺序表

当i==j时的位置上都是1,直接添加到顺序表即可,其他位置上的值:例如[2][1]的3==[1][2]的2+[1][1]1,这样就生成了一组数据,每生成一组就追加到顺序表中

代码语言:javascript
复制
class Solution {
    //numRows表示行
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> list = new ArrayList<List<Integer>>();
        List<Integer> list1 = new ArrayList<>();
        list1.add(1);
        list.add(list1);
        for (int i = 1; i < numRows; i++) {
            List<Integer> cur = new ArrayList<>();
            cur.add(1);
            List<Integer> pre = list.get(i-1);
            for (int j = 1; j < i; j++) {
                cur.add(pre.get(j) + pre.get(j-1));
            }
            cur.add(1);
            list.add(cur);
        }
        return list;
    }
}
代码语言:javascript
复制
class Solution {
    //numRows表示行
    public List<List<Integer>> generate(int numRows) {
       List<List<Integer>> list = new ArrayList<List<Integer>>();
        for (int i = 0; i < numRows; i++) {
            List<Integer> list1 = new ArrayList<>();
            for (int j = 0; j <= i; j++) {
                if (j == 0 || i == j) {
                    list1.add(1);
                } else {
                    list1.add(list.get(i-1).get(j-1) + list.get(i-1).get(j));
                }
            }
            list.add(list1);
        }
        return list;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2026-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.简单的洗牌算法
    • (1)定义每张扑克牌的属性
    • (2)生成一副扑克牌(不包含大小王)
    • (3)洗牌
    • (4)发牌
    •  (5)整体代码
    • (6)测试
  • 2.杨辉三角
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档