扑克牌自定义排序,使用集合TreeSet实现实体对象通过实现Comparable接口,重写compareTo比较方法进行排序;

一.继承Comparable实现排序

下面以扑克牌为例:

首先创建扑克实体类继承Comparable<Poker>接口:

public class Poker implements Comparable<Poker>{
    private String suit;
    private String point;
    public Poker(String suit, String point) {
        super();
        this.suit = suit;
        this.point = point;
    }
    public String getSuit() {
        return suit;
    }
    public void setSuit(String suit) {
        this.suit = suit;
    }
    public String getPoint() {
        return point;
    }
    public void setPoint(String point) {
        this.point = point;
    }
    
    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return this.suit + this.point;
    }
    @Override
    public int compareTo(Poker o) {//定义排序规则
        //将玩家手中的牌按照点数排序
        if (getIndex(this.point) >= getIndex(o.point)) {
            return 1;//compareTo返回正数,新添加的元素一定往后放
        }else {
            return -1;
        }
        //3 4 5 6 7 8 9 10 J Q K A 2 小王 大王
        //1 2 3 4 .................13 14 15
        //点数相同的,按照抓牌顺序排列
    }
    //将 J Q K A 2 小王 大王 重新编序号
    public int getIndex(String point) {
        if (point.equals("J")) {
            return 9;
        }else if (point.equals("Q")) {
            return 10;
        }else if (point.equals("K")) {
            return 11;
        }else if (point.equals("A")) {
            return 12;
        }else if (point.equals("2")) {
            return 13;
        }else if (point.equals("小王")) {
            return 14;
        }else if (point.equals("大王")) {
            return 15;
        }else {
            return Integer.parseInt(point) - 2;
        }
    }
    
}

main方法测试:

/*
 * 使用集合实现三人斗地主  【写不完明天写,昨天的登录注册没写完的今天必须写完】
    每人17张 三张底牌 
    要求:要求集合中存储的为扑克牌对象(如:new Poker(“红桃”,”2”),new Poker(“梅花”,”A”))
     发牌方法
         尽可能多的洗牌方法
         查看各个玩家牌面的方法
         每个玩家的牌面按照点数进行排序(明天学)

 * */
public class Demo1 {
    
    static ArrayList<Poker> pokers = new ArrayList<Poker>();
    static TreeSet<Poker> player1 = new TreeSet<Poker>();
    static TreeSet<Poker> player2 = new TreeSet<Poker>();
    static TreeSet<Poker> player3 = new TreeSet<Poker>();
    static ArrayList<Poker> dipai = new ArrayList<Poker>();
    public static void main(String[] args) {
        //创建扑克牌集合
        createPokers();
        //查看当前牌面
        showPokers(pokers);
        //洗牌
        shufflePokers();
        //查看当前牌面
        showPokers(pokers);
        //发牌
        sendPokers();
        
        //查看玩家牌面
        System.out.println("玩家1的牌面");
        showPokers(player1);
        System.out.println("玩家2的牌面");
        showPokers(player2);
        System.out.println("玩家3的牌面");
        showPokers(player3);
        System.out.println("底牌");
        showPokers(dipai);

    }

    private static void sendPokers() {
        // 一人一张抓拍,最后三张为底牌
        for (int i = 0; i < pokers.size() - 3; i++) {
            if (i % 3 == 0) {
                player1.add(pokers.get(i));
                player2.add(pokers.get(i+1));
                player3.add(pokers.get(i+2));
            }
        }
        
        dipai.add(pokers.get(51));
        dipai.add(pokers.get(52));
        dipai.add(pokers.get(53));
        
        
    }

    private static void shufflePokers() {
        //洗牌  取出每一张牌,跟随机位置的牌交换
        for (int i = 0; i < pokers.size(); i++) {
            //pokers.get(i)
            //获取随机位置   pokers.get(randomIndex)
            int randomIndex = new Random().nextInt(pokers.size());
            Poker temp = pokers.get(i);
            pokers.set(i, pokers.get(randomIndex));
            pokers.set(randomIndex, temp);
        }
    }

    public static void createPokers() {
        //创建集合存储点数
        ArrayList<String> suits = new ArrayList<String>();
        suits.add("红桃");
        suits.add("黑桃");
        suits.add("梅花");
        suits.add("方块");
        ArrayList<String> points = new ArrayList<String>();
        points.add("A");
        for (int i = 2; i <= 10; i++) {
            points.add(i + "");
        }
        points.add("J");
        points.add("Q");
        points.add("K");
        
        //往扑克牌集合中添加对象
        for (int i = 0; i < suits.size(); i++) {
            for (int j = 0; j < points.size(); j++) {
                //花色:suits.get(i)  点数points.get(j)
                //构建poker牌对象
                Poker poker = new Poker(suits.get(i), points.get(j));
                //将扑克牌对象添加到集合中
                pokers.add(poker);
                
            }
        }
        pokers.add(new Poker("", "大王"));
        pokers.add(new Poker("", "小王"));
        
        
    }
    
    public static void showPokers(Collection<Poker> c) {

       //遍历扑克牌数组
       for (Poker poker : c) {
           System.out.print(poker + " ");
       }
       System.out.println();
    }

    
}
 

二.使用匿名Comparator类实现排序

学生成绩排序为例:

public class Demo2 {

    public static void main(String[] args) {
        TreeSet<Student> set = new TreeSet<>(new Comparator<Student>() {

            @Override
            public int compare(Student o1, Student o2) {
                //要求:按总分进行排序,总分相同按照数学排,数学也相同,按照语文,语文也相同,按照名字排序
                Double score1 = o1.getChinese() + o1.getMath() + o1.getEnglish();
                Double score2 = o2.getChinese() + o2.getMath() + o2.getEnglish();
                //总分不相等的按照总分排序(升序)
                if (score1 != score2) {
                    //return (int)(score1 - score2);//转化之后85.5和85.4总分相同
                    return score1.compareTo(score2);
                }
                //总分相同的按照数学排序   数学不相等的按照数学排序
                if(o1.getMath() != o2.getMath()) {
                    return Double.valueOf(o1.getMath()).compareTo(Double.valueOf(o2.getMath()));
                }
                if (o1.getChinese() != o2.getChinese()) {
                    return Double.valueOf(o1.getChinese()).compareTo(Double.valueOf(o2.getChinese()));
                }
                
                return o1.getName().compareTo(o2.getName());
            }
        });
        set.add(new Student("lily", 100, 80, 90));
        set.add(new Student("frank", 80, 80, 80));
        set.add(new Student("amy", 60, 100, 90));
        
        //遍历集合
        System.out.println("姓名\t语文\t数学\t外语\t总分");//总分保留两位有效数字
        for (Student s : set) {
            System.out.println(s.getName() + "\t" + s.getChinese()+ "\t" + s.getMath()+ "\t" + s.getEnglish()+"\t" + (s.getChinese() + s.getMath() + s.getEnglish()));
        }
    }

}
 

猜你喜欢

转载自blog.csdn.net/qq_15204179/article/details/81901641
今日推荐