欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中ArrayList具體實(shí)現(xiàn)之簡(jiǎn)單的洗牌算法

 更新時(shí)間:2024年12月03日 09:46:54   作者:?喜歡做夢(mèng)  
這篇文章主要給大家介紹了Java中ArrayList具體實(shí)現(xiàn)之簡(jiǎn)單的洗牌算法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

引言

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的洗牌算法,這幅牌一共52張,不包含大小王,將這副牌進(jìn)行打亂(這幅牌一共52張,不包含大小王),一個(gè)五個(gè)人,每個(gè)人每輪摸一張牌,一共摸五輪。

需要實(shí)現(xiàn)的操作:

1.52張牌;

2.洗牌;

3.發(fā)牌:一共三人,5輪,每輪摸一張牌 

簡(jiǎn)單的洗牌算法

我們需要一幅牌,但是我們沒(méi)有牌類(lèi)這個(gè)類(lèi),所以我們要先自己定義一個(gè)牌類(lèi)

Card類(lèi)(牌類(lèi))

屬性:大小、花色

public class Card {
    //大小
    public int size;
    //花色
    public String suit;
    //初始化
    public Card(int size, String suit) {
        this.size = size;
        this.suit = suit;
    }
    @Override
    public String toString() {
        return "{"  + size+ suit +
                '}';
    }
}

既然有了牌類(lèi),那么我們就需要定義出一副牌了

CardList(一副牌)

 這副牌有哪些屬性?

大?。?-13;

花色:♥,♦,♣,♠

將每一張牌的大小和花色定義好,添加到整副牌中 

public class CardList {
    //四種花色
    public String[] suits={"?","?","?","?"};
    public List<Card> buyCard(){
        List<Card> cardList=new ArrayList<>();
        for (int i = 1; i <= 13; i++) {
            //cardList:放所有牌
            for (int j = 0; j < 4; j++) {
                //定義每一張牌的大小以及花色
                Card card=new Card(i,suits[j]);
                //將每張牌放到這幅牌中
                cardList.add(card);
            }
        }
       return  cardList;
    }
}

測(cè)試

  public static void main(String[] args) {
        CardList cardList=new CardList();
        System.out.println(cardList.buyCard());
    }

結(jié)果:

washCard(洗牌)

有了牌,我們就要像將其進(jìn)行洗牌,但是我們要怎么進(jìn)行洗牌呢?

這是一副牌,我們要將其位置進(jìn)行打亂

那么我們是不是可以從后開(kāi)始往前,將后面的牌與任意一張牌進(jìn)行交換,這樣順序就被打亂了

所以我們要生成一個(gè)隨機(jī)的數(shù),用來(lái)當(dāng)中隨機(jī)與之要交換的下標(biāo) 

隨機(jī)數(shù)的生成:

        Random random=new Random();
        int index=random.nextInt();

因?yàn)樗粩噙M(jìn)行交換,隨機(jī)生成數(shù)也有一個(gè)范圍,并且每一次交換完,生成范圍減少。所以我們用for循環(huán)語(yǔ)句,其i的起始位置從最后一位牌開(kāi)始,向前交換

 public void washCard(List<Card> cardList){
        Random random=new Random();
        for (int i = cardList.size()-1; i >0 ; i--) {
            //生成范圍在0到51之間,隨著交換次數(shù),范圍不斷減少
            int index=random.nextInt(i);
            //交換牌
            swap(i,index,cardList);
        }
    }

接下來(lái)我們需要寫(xiě)一個(gè)swap方法用來(lái)交換牌

swap()

可能你想這么寫(xiě),但是他是錯(cuò)誤的,因?yàn)樗皇菙?shù)組,且他的里面有數(shù)組

private void swap(int i,int j,List<Card> cardList){
          Card tmp=cardList[i];
          cardList[i]=cardList[j];
          cardList[j]=tmp;
   
    }

 正確寫(xiě)法:

private void swap(int i,int j,List<Card> cardList){
        Card tmp=cardList.get(i);
        cardList.set(i,cardList.get(j));
        cardList.set(j,tmp);
    }

測(cè)試:

   public static void main(String[] args) {
        CardDemo cardDemo=new CardDemo();
        List<Card> cardList=cardDemo.buyCard();
        System.out.println(cardList);
        CardFunctions cardFunctions1=new CardFunctions();
        cardFunctions1.washCard(cardList);
        System.out.println(cardList);
    }

 結(jié)果:

dealCard(發(fā)牌)

一共三人,5輪,每輪摸一張牌 

所以我們先定義三個(gè)人,然后利用for循環(huán)語(yǔ)句,進(jìn)行每輪的抽牌

  //發(fā)牌
    public void dealCard(List<Card> cardList){
        List<Card> hand1=new ArrayList<>();
        List<Card> hand2=new ArrayList<>();
        List<Card> hand3=new ArrayList<>();
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {

            }

        }
    }

每個(gè)人從牌的最上方揭走一張牌,我們要使用到remove

cardList.remove(0);

但是我們要怎么將這些牌放到對(duì)應(yīng)的手里面,因?yàn)閔and1,2,3里面是一維,所以我們可以定義一個(gè)二維來(lái)儲(chǔ)存他們

  public void dealCard(List<Card> cardList){
        List<Card> hand1=new ArrayList<>();
        List<Card> hand2=new ArrayList<>();
        List<Card> hand3=new ArrayList<>();
        List<List<Card>> hand=new ArrayList<>();
        hand.add(hand1);
        hand.add(hand2);
        hand.add(hand3);
        for (int i = 0; i < 5; i++) {
            for (int j = 0; j < 3; j++) {
                Card card=cardList.remove(0);
                //將摸到的手牌分別放到handj手中
                hand.get(j).add(card);
            }
        }
    }

 測(cè)試:

    public static void main(String[] args) {
        //一副牌52張
        CardDemo cardDemo=new CardDemo();
        List<Card> cardList=cardDemo.buyCard();
        System.out.println(cardList);
        //洗牌
        CardFunctions cardFunctions1=new CardFunctions();
        cardFunctions1.washCard(cardList);
        System.out.println(cardList);
        //分牌
        List<List<Card>> ret=cardFunctions1.dealCard(cardList);
        for (int i = 0; i < ret.size(); i++) {
            System.out.println("第"+(i+1)+"人:"+ret.get(i));
        }
    }

結(jié)果:

總結(jié)

到此這篇關(guān)于Java中ArrayList具體實(shí)現(xiàn)之簡(jiǎn)單的洗牌算法的文章就介紹到這了,更多相關(guān)Java ArrayList洗牌算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用jdbcTemplate查詢(xún)返回自定義對(duì)象集合代碼示例

    使用jdbcTemplate查詢(xún)返回自定義對(duì)象集合代碼示例

    這篇文章主要介紹了使用jdbcTemplate查詢(xún)返回自定義對(duì)象集合代碼示例,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Mybatis下的SQL注入漏洞原理及防護(hù)方法解析

    Mybatis下的SQL注入漏洞原理及防護(hù)方法解析

    SQL 注入是發(fā)生在 Web 程序中數(shù)據(jù)庫(kù)層的安全漏洞,是網(wǎng)站存在最多也是最簡(jiǎn)單的漏洞,在實(shí)際項(xiàng)目中,即使使用了 Mybatis 框架,但仍然有可能因?yàn)榫幋a人員安全意識(shí)不足而導(dǎo)致 SQL 注入問(wèn)題,這篇文章主要介紹了Mybatis下的SQL注入漏洞原理及防護(hù)方法?,需要的朋友可以參考下
    2022-11-11
  • 淺談Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn)

    淺談Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn)

    這篇文章主要介紹了Java(SpringBoot)基于zookeeper的分布式鎖實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java類(lèi)的加載連接和初始化實(shí)例分析

    Java類(lèi)的加載連接和初始化實(shí)例分析

    這篇文章主要介紹了Java類(lèi)的加載連接和初始化,結(jié)合具體實(shí)例形式分析了java類(lèi)的加載、連接、初始化相關(guān)原理與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-07-07
  • SpringBoot Maven Clean報(bào)錯(cuò)解決方案

    SpringBoot Maven Clean報(bào)錯(cuò)解決方案

    這篇文章主要介紹了SpringBoot Maven Clean報(bào)錯(cuò)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之在線網(wǎng)盤(pán)系統(tǒng)的實(shí)現(xiàn)

    Java畢業(yè)設(shè)計(jì)實(shí)戰(zhàn)之在線網(wǎng)盤(pán)系統(tǒng)的實(shí)現(xiàn)

    這是一個(gè)使用了java+JSP+Springboot+maven+mysql+ThymeLeaf+FTP開(kāi)發(fā)的在線網(wǎng)盤(pán)系統(tǒng),是一個(gè)畢業(yè)設(shè)計(jì)的實(shí)戰(zhàn)練習(xí),具有網(wǎng)盤(pán)該有的所有功能,感興趣的朋友快來(lái)看看吧
    2022-01-01
  • Spring Boot Web 開(kāi)發(fā)注解篇

    Spring Boot Web 開(kāi)發(fā)注解篇

    在 Spring Boot 快速入門(mén)中,只要在 pom.xml 加入了 spring-boot-starter-web 依賴(lài),即可快速開(kāi)發(fā) web 應(yīng)用。下文給大家詳細(xì)介紹了spring boot web 開(kāi)發(fā)注解,感興趣的朋友參考下吧
    2017-08-08
  • Java中的數(shù)組流ByteArrayOutputStream用法

    Java中的數(shù)組流ByteArrayOutputStream用法

    Java中的ByteArrayOutputStream是java.io包中的一個(gè)類(lèi),用于在內(nèi)存中創(chuàng)建字節(jié)數(shù)組緩沖區(qū),支持動(dòng)態(tài)擴(kuò)展,它繼承自O(shè)utputStream,允許以字節(jié)形式寫(xiě)入數(shù)據(jù),無(wú)需與外部設(shè)備交互,常用方法包括write()、toByteArray()、toString()等
    2024-09-09
  • Spring Data Neo4j Cypher查詢(xún)使用

    Spring Data Neo4j Cypher查詢(xún)使用

    本文介紹了Spring Data Neo4j Cypher查詢(xún)使用的幾種方法,包括使用Repository接口、動(dòng)態(tài)查詢(xún)、服務(wù)層組合、外部查詢(xún)文件和圖形化查詢(xún)構(gòu)建器, 感興趣的可以了解一下
    2024-11-11
  • MyBatisPlus唯一索引批量新增或修改的實(shí)現(xiàn)方法

    MyBatisPlus唯一索引批量新增或修改的實(shí)現(xiàn)方法

    本文主要介紹了MyBatisPlus唯一索引批量新增或修改的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評(píng)論