问题:
求一副杂乱的牌的排序,有梅花(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();
}
打印结果:
9 CLUBS
5 SPADES
13 HEARTS
7 CLUBS
3 SPADES
12 CLUBS
11 DIAMONDS
2 DIAMONDS
3 DIAMONDS
11 SPADES
7 HEARTS
12 DIAMONDS
2 HEARTS
8 SPADES
10 HEARTS
5 HEARTS
4 SPADES
11 HEARTS
10 CLUBS
13 CLUBS
7 SPADES
13 SPADES
1 CLUBS
12 HEARTS
6 SPADES
6 DIAMONDS
5 DIAMONDS
4 DIAMONDS
8 HEARTS
3 HEARTS
1 DIAMONDS
3 CLUBS
8 DIAMONDS
9 HEARTS
1 HEARTS
1 SPADES
7 DIAMONDS
13 DIAMONDS
6 HEARTS
11 CLUBS
8 CLUBS
4 CLUBS
9 DIAMONDS
10 DIAMONDS
5 CLUBS
12 SPADES
6 CLUBS
4 HEARTS
10 SPADES
9 SPADES
2 SPADES
2 CLUBS
简单测试---排序再打印结果:
//排序后再打印结果
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();
}
结果:
1 CLUBS
2 CLUBS
3 CLUBS
4 CLUBS
5 CLUBS
6 CLUBS
7 CLUBS
8 CLUBS
9 CLUBS
10 CLUBS
11 CLUBS
12 CLUBS
13 CLUBS
1 DIAMONDS
2 DIAMONDS
3 DIAMONDS
4 DIAMONDS
5 DIAMONDS
6 DIAMONDS
7 DIAMONDS
8 DIAMONDS
9 DIAMONDS
10 DIAMONDS
11 DIAMONDS
12 DIAMONDS
13 DIAMONDS
1 HEARTS
2 HEARTS
3 HEARTS
4 HEARTS
5 HEARTS
6 HEARTS
7 HEARTS
8 HEARTS
9 HEARTS
10 HEARTS
11 HEARTS
12 HEARTS
13 HEARTS
1 SPADES
2 SPADES
3 SPADES
4 SPADES
5 SPADES
6 SPADES
7 SPADES
8 SPADES
9 SPADES
10 SPADES
11 SPADES
12 SPADES
13 SPADES