Java中利用Collections、HashMap、TreeSet混合使用Demo

本文介绍了一种模拟斗地主游戏洗牌和发牌的算法实现,通过使用Java集合框架中的HashMap、ArrayList和TreeSet等数据结构,实现了牌的存储、洗牌和发牌过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述
代码:

package day18_Poker;

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


/*
 * 模拟斗地主洗牌和发牌
 * 
 * 分析:
 *      A:创建一个牌盒
 *      B:装牌
 *      C:洗牌
 *      D:发牌
 *      E:看牌
 * 思路:
 *      A:创建一个HashMap集合
 *      B:创建一个ArrayList集合
 *      C:创建花色数组和点数数组
 *      D:从0开始往HashMap里面存储编号,并存储对应的牌
 *          同时从ArrayList里面存储编号即可
 *      E:洗牌(洗的是编号)
 *      F:发牌(发的也是编号,为了保证编号是排序,就创建TreeSet集合接收)
 *      G:看牌(遍历TreeSet集合,获取编号,到HashMap集合照对应的牌)
 * */
public class PokerDemo {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //创建HashMap集合
        HashMap<Integer, String> hm = new HashMap<Integer,String>();
        //创建一个ArrayList集合
        ArrayList<Integer> array = new ArrayList<Integer>();
        //创建花色数组和点数数组
        String[] colors={"♠","♥","♣","♦"};
        String[] numbers={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
        //从0开始往HashMap里面存储编号,并存储对应的牌
        int index=0;
        for(String number:numbers){
            for(String color:colors){
                String poker=color.concat(number);
                //放入HashMap
                hm.put(index, poker);//对应左侧HashMap图
                array.add(index);//对应右侧Array图
                index++;
            }
        }
        //放大小王
        hm.put(index, "小王");
        array.add(index);
        index++;//放入元素加1
        hm.put(index, "大王");
        array.add(index);

        //洗牌(洗的是编号)
        Collections.shuffle(array);
        //F:发牌(发的也是编号,为了保证编号是排序,就创建TreeSet集合接收)
        TreeSet<Integer> fengQingYang = new TreeSet<Integer>();
        TreeSet<Integer> linQingXia = new TreeSet<Integer>();
        TreeSet<Integer> liuYi = new TreeSet<Integer>();
        TreeSet<Integer> diPai  = new TreeSet<Integer>();

        //发牌
        for(int i=0;i<array.size();i++){
            if(i>=array.size()-3){
                diPai.add(i);
            }else if(i%3==0){
                fengQingYang.add(i);
            }else if(i%3==1){
                linQingXia.add(i);
            }else if(i%3==2){
                liuYi.add(i);
            }
        }

        //看牌(遍历TreeSet集合,获取编号,到HashMap集合照对应的牌)  
        lookPoker("风清扬", fengQingYang, hm);
        lookPoker("林青霞", linQingXia, hm);
        lookPoker("刘意", liuYi, hm);
        lookPoker("底牌", diPai, hm);

    }
    public static void lookPoker(String name,TreeSet<Integer> ts,HashMap<Integer, String>hm){
        System.out.println(name+"的牌是:");
        for(Integer key:ts){
            String value=hm.get(key);
            System.out.print(value+" ");
        }
        System.out.println();
    }   
}

三者总结:

1.集合(自己补齐)
    Collection(单列集合)
            List(有序,可重复)
                    ArrayList
                        底层数据结构是数组,查询块,增删慢
                        线程不安全,效率高
                    Vector
                        底层数据结构是数组,查询块,增删慢
                        线程安全,效率低
                    LinkedList
                        底层数据结构是链表,查询慢,增删块
                        线程不安全,效率高
            Set(无序,不可重复)
                    HashSet
                        底层数据结构是哈希表
                        哈希表依赖两个方法:hashCode()和equals()
                        执行顺序:
                            首先判断hashCode()值是否相同
                                是:继续执行equals()方法,看其返回值
                                    true:说明元素重复,不添加
                                    false:就直接添加
                                否:直接添加
                        最终:
                            自动生成hashCode()和equals()即可。alt+shift

                        LinkedHashSet
                            底层数据结构由链表和哈希表组成。
                            有链表保证元素有序
                            由哈希表保证唯一
                    TreeSet
                        底层数据结构是红黑树。(是一种自平衡的二叉树)
                        如何保证元素唯一性?
                            根据比较的返回值是否是0来决定
                        如何保证元素的排序?
                            自然排序(元素具备比较性)
                                让元素所属的类实现Comparatable接口
                            比较器排序(集合具备比较性)
                                让集合接收一个Comparator的实现类对象
    Map(双列集合)
        Map集合的数据结构仅仅针对键有效,与值无关
            A:Map集合的数据结构仅仅针对键有效,与值无关
            B:存储的是键值对形式的元素,键唯一,值可以
        HashMap
            底层数据结构是哈希表
                        哈希表依赖两个方法:hashCode()和equals()
                        执行顺序:
                            首先判断hashCode()值是否相同
                                是:继续执行equals()方法,看其返回值
                                    true:说明元素重复,不添加
                                    false:就直接添加
                                否:直接添加
                        最终:
                            自动生成hashCode()和equals()即可。alt+shift
            LinkedHashMap
                底层数据结构由链表和哈希表组成。
                            有链表保证元素有序
                            由哈希表保证唯一
        Hashtable
            底层数据结构是哈希表
                        哈希表依赖两个方法:hashCode()和equals()
                        执行顺序:
                            首先判断hashCode()值是否相同
                                是:继续执行equals()方法,看其返回值
                                    true:说明元素重复,不添加
                                    false:就直接添加
                                否:直接添加
                        最终:
                            自动生成hashCode()和equals()即可。alt+shift
        TreeMap
            底层数据结构是红黑树。(是一种自平衡的二叉树)
                        如何保证元素唯一性?
                            根据比较的返回值是否是0来决定
                        如何保证元素的排序?
                            自然排序(元素具备比较性)
                                让元素所属的类实现Comparatable接口
                            比较器排序(集合具备比较性)
                                让集合接收一个Comparator的实现类对象
2:到底使用那种集合(自己补齐)
    看需求:
        是否是键值对形式:
            是:  Map
                键是否需要排序:
                    是:TreeMap
                    否:HashMap
                不知道,就使用HashMap
            否:Collection
                元素是否唯一?
                    是:Set
                        元素是否需要排序
                            是:TreeSet
                            否:HashSet
                        不知道,就使用HashSet
                    否:List
                        要安全吗?
                            是:Vector(其实我们也不用,后面我们讲解了多线程以后,再回顾)
                            否:ArrayList或者LinkedList
                                增删多:LinkedList
                                查询多:ArrayList
                            不知道,就是用ArrayList
                不知道,就使用ArrayList
3:集合的常见方法及便利方式
    Collection:
        add()
        remove()
        contains()
        iterator()
        size()

        遍历:
            增强for
            迭代器
        |--List
            get()
            遍历:
                普通for
        |--Set
    Map:
        put()
        remove()
        containsKey(),containsValue()
        keySet()
        get()
        value()
        entrySet()
        size()

        遍历:
            根据键找值
            根据键值对对象分别找键和值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值