详解 Collections类

(请关注 本人“集合总集篇”博文——《详解 集合框架》

有的同学可能会有这样的疑问 —— Collections类也是集合吗?
答曰:非也!
那为什么要讲解这个类呢?
答曰:此类为 针对集合操作 的工具类

Collections类:

概念
针对集合操作 的工具类

首先,本人来展示下 这个类的API:

  1. 构造方法:
  • static List EMPTY_LIST :
    空的列表(不可变的)
  • static Map EMPTY_MAP
    空的映射(不可变的)
  • static Set EMPTY_SET
    空的 set(不可变的)
  1. 常用API:
  • public static < T > void sort(List< T > list):
    排序,默认按照自然顺序
  • public static < T > int binarySearch(List<?> list,T key):
    二分查找
  • public static < T > T max(Collection<?> coll):
    获取最大值
  • public static void reverse(List<?> list):
    反转
  • public static void shuffle(List<?> list):
    随机置换

可以看到,本人列举的常用API都是关于List的操作,这是因为List存储的数据都是有序的,而且是单列的,所以需要的操作就更灵活些。即便是双列的Map,在一定程度上也可以拆成单列的List(因为对于Map的操作,主要是针对“键元素”)

那么,本人在这里来讲解一个很有趣的例子 —— 模拟斗地主 的 洗牌和发牌 操作:
本人先来说明一下规则:

规则:

  1. 一共三个玩家
  2. 每个玩家按照顺序依次抽取扑克牌,没人总共抽取17张
  3. 剩余3张扑克牌作为底牌,由“地主”收取

由于本例仅展示发牌和看牌的操作,所以,大致操作流程如下:

  1. 将54张扑克牌依次存储一个ArrayList中(装进牌盒子)
  2. 打乱这54张扑克牌(洗牌)
  3. 按顺序给三个TreeSet依次发牌,并留三张牌存入另一个TreeSet中(发牌、理牌)
  4. 遍历这四个TreeSet(看牌)

现在,本人根据上面的讲解上代码:

首先,本人给出一个理牌器

package about_collections;

import java.util.Comparator;

public class PokerSorter implements Comparator<String> {

    public PokerSorter() {
    }

    @Override
    public int compare(String poker1, String poker2) {
        if(poker2.equals("☀")
                || (!poker1.equals("☀") && poker2.equals("🌙"))) {
            return -1;
        } else if (poker1.equals("☀") || poker1.equals("🌙")) {
            return 1;
        }

        int value1 = getValue(poker1);
        int value2 = getValue(poker2);
        int res = value1 - value2;
        if (res == 0) {
            String color1 = poker1.substring(0, 1);
            String color2 = poker2.substring(0, 1);

            res = dealValueSame(color1, color2);
        }
        return res;
    }
    private int dealValueSame(String color1, String color2) {
        if (color1.equals("♣")) {
            return 1;
        } else if (color1.equals("♥")
                || (color1.equals("♠") && color2.equals("♣"))
                || ((color1.equals("♦") && !color2.equals("♥")))) {
            return -1;
        }
        return 1;
    }

    private int getValue(String poker) {
        if (poker.substring(1).equals("A")) {
            return 1;
        } else if (poker.substring(1).equals("J")) {
            return 11;
        } else if (poker.substring(1).equals("Q")) {
            return 12;
        } else if (poker.substring(1).equals("K")) {
            return 13;
        } else {
            return Integer.valueOf(poker.substring(1));
        }
    }

}

现在,本人来编写下实现这个游戏:

package about_collections;

import java.util.ArrayList;
import java.util.Collections;
import java.util.TreeSet;

public class PokerGame {

    public static void main(String[] args) {
        //斗地主: 发牌 理牌 看牌

        /* 创建牌盒子 */
        ArrayList<String> pokerBox = new ArrayList<>();
        /* 生成牌 装进牌盒子 */
        String[] colos = {"♥", "♠", "♦", "♣"};
        String[] nums = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"};
        for (String color : colos) {
            for (String num : nums) {
                String poker = color.concat(num);
                pokerBox.add(poker);
            }
        }
        /* 手动添加大小王 */
        pokerBox.add("🌙");	//假设🌙代表小王
        pokerBox.add("☀");		//假设☀代表小王
        /* 洗牌 */
        Collections.shuffle(pokerBox); //随机打乱集合中元素的顺序

        /* 发牌、理牌 */
        //三个人,对应三个集合 底牌也是个集合
        //三个人 一人17张牌一副牌, 还有三张底牌
        TreeSet<String> gaoJin = new TreeSet<String>(new PokerSorter());
        TreeSet<String> chenDaoZai = new TreeSet<String>(new PokerSorter());
        TreeSet<String> zhouXingXing = new TreeSet<String>(new PokerSorter());
        TreeSet<String> lastPokers = new TreeSet<String>(new PokerSorter());
        //发牌的顺序:
        //高进 0 3 6 9 ... ...
        //陈刀仔 1 4 7 10 ... ...
        //周星星 2 5 8 11 ... ...
        for (int i = 0; i < pokerBox.size(); i++) {
            if(i>=pokerBox.size()-3){
                lastPokers.add(pokerBox.get(i));
            }else if(i%3==0){
                gaoJin.add(pokerBox.get(i));
            } else if (i % 3 == 1) {
                chenDaoZai.add(pokerBox.get(i));
            }else {
                zhouXingXing.add(pokerBox.get(i));
            }
        }

        /* 看牌 */
        lookPoker("高进", gaoJin);
        lookPoker("陈刀仔", chenDaoZai);
        lookPoker("周星星", zhouXingXing);
        lookPoker("底牌", lastPokers);
    }

    private static void lookPoker(String name, TreeSet<String> treeSet) {
        System.out.println(name);
        for (String poker : treeSet) {
            System.out.print(poker + "\t");
        }
        System.out.println();

    }

}

那么,本人来展示下运行结果:
在这里插入图片描述
可以看到,斗地主的发牌、理牌、看牌步骤实现完成!

(集合总集篇链接:https:////www.cnblogs.com/codderYouzg/p/12416560.html

posted @ 2020-03-05 11:28  在下右转,有何贵干  阅读(182)  评论(0编辑  收藏  举报