关于扑克牌的简单排序问题

来源:互联网 发布:筑龙投标软件下载 编辑:程序博客网 时间:2024/04/28 11:43

 

问题:

求一副杂乱的牌的排序,有梅花(CLUBS),方块(DIAMONDS),红桃(HEARTS),黑桃(SPADES)。每种颜色为1,1,....13,不包含两张大王。


 

解:

以下为简单的随意抽象实现,现实情况可能更复杂。因为是随机产生扑克牌,如果并发几千万的情况,内存可能会出现问题,简单的一副牌是OK的。

 

CODE:

import java.util.Random;enum CardType{CLUBS,DIAMONDS,HEARTS,SPADES}class Card{    CardType cardType;      int num;        public void setNum(int n){        this.num=n;    }        public int getNum(){        return this.num;    }        public void setCardType(CardType ct){        this.cardType=ct;    }        public CardType getCardType(){        return this.cardType;    }    }class Cards{    private static Random r=new Random();    private Card[] cards=null;             public Cards(){    init();    }        /**    *初始化    */    private void init(){        cards=new Card[52];          cards[0]=produceCard();        for(int i=1;i<52;i++){           Card c=produceCard();           int j=i-1;           while(j>=0){               if(!eq(cards[j],c)){                   j--;               }else{                   c=produceCard();                   j=i-1;               }           }           cards[i]=c;        }    }        /**     * 洗牌     */    public void shulffle(){    cards=null;     init();    }        public Card produceCard(){        Card c=new Card();        CardType ct=CardType.class.getEnumConstants()[r.nextInt(4)];                int num=0;        while(num==0){            num=r.nextInt(14);        }                c.setCardType(ct);        c.setNum(num);        return c;    }    public boolean contain(Card card){        for(int i=0;i<cards.length;i++){            Card c=cards[i];            if(eq(c,card)){                return true;            }        }        return false;    }     private boolean eq(Card c1,Card c2){        if(c1.getNum()==c2.getNum()&&c1.getCardType()==c2.getCardType()){            return true;        }        return false;    }      /**    *默认排序    *<pre>    *    按枚举类型:梅花,方块,红桃,黑桃,从1到13排序    *</pre>    */    public void sortCards(){        Card[] cardSorted=new Card[52];        for(int i=0;i<cards.length;i++){            int ind=0;            if(cards[i].getCardType()==CardType.CLUBS){                ind=cards[i].getNum()-1;                cardSorted[ind]=cards[i];            }else if(cards[i].getCardType()==CardType.DIAMONDS){                ind=cards[i].getNum()+12;                cardSorted[ind]=cards[i];            }else if(cards[i].getCardType()==CardType.HEARTS){                ind=cards[i].getNum()+25;                cardSorted[ind]=cards[i];            }else if(cards[i].getCardType()==CardType.SPADES){                ind=cards[i].getNum()+38;                cardSorted[ind]=cards[i];            }                }        cards=cardSorted;    }       public Card[] getCards(){        return cards;    }            public Card getCards(int index) throws Exception{        if(index<0){            throw new Exception("数组下标异常!");        }        return cards[index];    }        //TODO 按类型排序    //public void sortCards(String type){} //TODO 按数量分牌    //public Cards distributeCards(int n){} }

简单测试:

public class TestCards {public static void main(String[] agrs){Cards cs=new Cards();Card[] arr_c=cs.getCards();for(int i=0;i<arr_c.length;i++){System.out.print(arr_c[i].getNum()+"\t");System.out.print(arr_c[i].getCardType());System.out.println();}

打印结果:

9CLUBS5SPADES13HEARTS7CLUBS3SPADES12CLUBS11DIAMONDS2DIAMONDS3DIAMONDS11SPADES7HEARTS12DIAMONDS2HEARTS8SPADES10HEARTS5HEARTS4SPADES11HEARTS10CLUBS13CLUBS7SPADES13SPADES1CLUBS12HEARTS6SPADES6DIAMONDS5DIAMONDS4DIAMONDS8HEARTS3HEARTS1DIAMONDS3CLUBS8DIAMONDS9HEARTS1HEARTS1SPADES7DIAMONDS13DIAMONDS6HEARTS11CLUBS8CLUBS4CLUBS9DIAMONDS10DIAMONDS5CLUBS12SPADES6CLUBS4HEARTS10SPADES9SPADES2SPADES2CLUBS

简单测试---排序再打印结果:

//排序后再打印结果cs.sortCards();arr_c=cs.getCards();for(int i=0;i<arr_c.length;i++){System.out.print(arr_c[i].getNum()+"\t");System.out.print(arr_c[i].getCardType());System.out.println();}

结果:

1CLUBS2CLUBS3CLUBS4CLUBS5CLUBS6CLUBS7CLUBS8CLUBS9CLUBS10CLUBS11CLUBS12CLUBS13CLUBS1DIAMONDS2DIAMONDS3DIAMONDS4DIAMONDS5DIAMONDS6DIAMONDS7DIAMONDS8DIAMONDS9DIAMONDS10DIAMONDS11DIAMONDS12DIAMONDS13DIAMONDS1HEARTS2HEARTS3HEARTS4HEARTS5HEARTS6HEARTS7HEARTS8HEARTS9HEARTS10HEARTS11HEARTS12HEARTS13HEARTS1SPADES2SPADES3SPADES4SPADES5SPADES6SPADES7SPADES8SPADES9SPADES10SPADES11SPADES12SPADES13SPADES


 

原创粉丝点击