A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

今天学习了用ArrayList模拟斗地主发牌,之后老师说对手里的牌排序,但是留了一个白,后来我想了想,可以这样实现
代码如下
  1. package day17.coll.test;

  2. import java.util.Comparator;

  3. public class MyComparator implements Comparator<String> {
  4.         /**
  5.          * 创建两个表,一个是花色表,一个是大小表
  6.          */
  7.         private static String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
  8.         private static String[] color = {"黑桃","红桃","梅花","方块","小王","大王"};
  9.         //private static String[] ghost = {"小王","大王"};
  10.         @Override
  11.         public int compare(String s1, String s2) {
  12.        
  13.                 //返回这两张牌的自定义Hash值的差
  14.                 return getHC(s1)-getHC(s2);
  15.                
  16.                
  17.         }
  18.         /*
  19.          * 查表
  20.          */
  21.         private int getIndex(String[] s,String str){
  22.                 for (int i = 0; i < s.length; i++) {
  23.                         if(s[i].equals(str)){
  24.                                 return i;
  25.                         }
  26.                 }
  27.                 return -1;
  28.         }
  29.         /**
  30.          * 计算每张牌的自定义Hash值,把每张牌分为两部分,分别查表,计算得到的索引值
  31.          * 为了保证大小王比所有牌大,并且数字的权重大于花色,因此计算是分配了不同的权重
  32.          * @param s 传入的牌
  33.          * @return 该牌的自定义Hash值
  34.          */
  35.          
  36.         private int getHC(String s){
  37.                 //如果这张牌不是大王或者小王,那么就分解,并分别查表,最后得到一个数字权重为100,花色权重为1的hash值
  38.                 if(s.length()!=2){
  39.                         return (getIndex(num,s.substring(2))+1)*100+(getIndex(color,s.substring(0, 2))+1);
  40.                 }
  41.                 //如果是大小王,那么返回一个权重为1000的hash值
  42.                 else{
  43.                         return getIndex(color,s.substring(0, 2))*1000;
  44.                 }
  45.         }

  46. }
复制代码

这是牌库的代码
  1. package day17.coll.test;

  2. import java.util.ArrayList;

  3. public class Paiku {
  4.         static String[] s = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
  5.         static String[] s1 = {"黑桃","红桃","梅花","方块"};
  6.         static ArrayList<String> al = null;
  7.         public Paiku(){
  8.         }
  9.        
  10.         public static ArrayList<String> getPaiku(){
  11.                 al = new ArrayList<String>();
  12.                 al.add("大王");
  13.                 al.add("小王");
  14.                
  15.                 for(String color:s1){
  16.                         for(String num:s){
  17.                                 al.add(color+num);
  18.                         }
  19.                 }
  20.                 return al;
  21.         }
  22.        
  23. }
复制代码

测试代码
  1. package day17.coll.test;

  2. import java.util.ArrayList;
  3. import java.util.Collections;

  4. public class CollTest {
  5.         public static void main(String[] args) {
  6.                 ArrayList<String> al = Paiku.getPaiku();
  7.                
  8.                 //System.out.println(al);
  9.                 Collections.shuffle(al);
  10.                 Collections.sort(al,new MyComparator());
  11.                 System.out.println(al);
复制代码

输出结果是
[黑桃3, 红桃3, 梅花3, 方块3, 黑桃4, 红桃4, 梅花4, 方块4, 黑桃5, 红桃5, 梅花5, 方块5, 黑桃6, 红桃6, 梅花6, 方块6, 黑桃7, 红桃7, 梅花7, 方块7, 黑桃8, 红桃8, 梅花8, 方块8, 黑桃9, 红桃9, 梅花9, 方块9, 黑桃10, 红桃10, 梅花10, 方块10, 黑桃J, 红桃J, 梅花J, 方块J, 黑桃Q, 红桃Q, 梅花Q, 方块Q, 黑桃K, 红桃K, 梅花K, 方块K, 黑桃A, 红桃A, 梅花A, 方块A, 黑桃2, 红桃2, 梅花2, 方块2, 小王, 大王]

测试成功

1 个回复

正序浏览
学习一下。。。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马