集合基础(二)

双列集合Map

  • Map是一个接口

  • 如何创建Map对象

    • 多态的方式
    • 具体实现类HashMap
  • Map集合的常用功能

    • 添加元素

      • V put(K key,V value)
    • 根据键值对删除

    • 移除所有键值对元素

    • 判断集合是否包含指定的键

    • 判断是否包含指定的值

    • 判断集合是否为空

    • 集合的长度

  • Map集合的获取功能

    • 根据键获取值
    • 获取所有键的集合
    • 获取所有值得集合
    • 获取所有键值对对象的集合
  • Map集合的遍历方式

    • 使用KeySet获取所有的键,再使用增强for
    • 使用EntrySet获取所有键值对,再使用for循环

Stream流

Stream流的思想方法

  • 获取方法

    • 获取对象,将其置于流水线上
  • 中间方法

    • 对流水线上的数据进行操作一次操作完毕,还可以进行其他操作
  • 终结方法

    • 一个Stream流只有一个终结方法,是流水线最后一个操作

生成Stream流的方式

  • Collection体系集合

    • 使用默认方法Stream()生成流
  • Map集合体系

    • 把Map转成Set集合,简介生成流
  • 数组

    • 通过Arrays静态方法生成流
  • 同种类型的多个数据

    • 通过接口的静态方法of( T value)生成流

练习

知识点

Map集合基础,练习

  1. Map存储数据的特点是什么?

    Map存数据是以键值对的形式,可以存储双列。

  2. 描述HashMap的底层实现原理(jdk 8版)?

    二叉树,数组,红黑树

  3. Map中常用实现类有哪些?各自有什么特点?

    TreeMap

    HashMap

  4. 如何遍历Map中的key-value对,代码实现(至少2种)

    方法一:
    Set<Map.Entry<String, String>> entries = map.entrySet();
            for (Map.Entry<String, String> entry : entries) {
                String key= entry.getKey();
                String value=entry.getValue();
                System.out.println(key+","+value);
    
            }
    方法二:
        Set<Integer> it = stations.keySet();
            for (Integer key : it) {
                String value=stations.get(key);
                System.out.println(key+" "+value);
            }
    
  5. Collection和Collections的区别?

    ​ Collection: 是集合类的上层接口。本身是一个Interface,里面包含了一些集合的基本操作。 Collection接口时Set接口和List接口的父接口

    Collections 是一个包装类,Collection 表示一组对象,这些对象也称为 collection 的元素。一些 collection 允许有重复的元素, 而另一些则不允许,一些 collection 是有序的,而另一些则是无序的

  6. Map接口中的常用方法有哪些 ?

    put() remove() keySet() entrySet() replace()…

  7. Map)已知某学校的教学课程内容安排如下:
    前者是老师,后者是老师所教的课程:
    		("Tom", "CoreJava");
            ("John", "Oracle");
            ("Susan", "Oracle");
            ("Jerry", "JDBC");
            ("Jim", "Unix");
            ("Kevin", "JSP");
            ("Lucy", "JSP");
            
    完成下列要求:
    1) 使用一个Map,以老师的名字作为键,以老师教授的课程名作为值,表示上述课程安排。
    2) 增加了一位新老师Allen 教JDBC
    3Lucy 改为教CoreJava
    4) 遍历Map,输出所有的老师及老师教授的课程(Set<Map.Entry<String,String>>Set<String> get(key)都可)
    5) 利用Map,输出所有教JSP的老师。
    
    public static void main(String[] args) {
            Map<String,String> map=new HashMap<String,String>();
           map.put("Tom", "CoreJava");
           map.put("John", "Oracle");
            map.put("Susan", "Oracle");
            map.put("Jerry", "JDBC");
            map.put("Jim", "Unix");
            map.put("Kevin", "JSP");
            map.put("Lucy", "JSP");
            map.put("Allen","JDBC");
            //修改值,key相同,value覆盖
            map.put("lucy","CoreJava");
            System.out.println(map);
    
            //遍历输出
            //获取所有键的集合
            Set<String> keySet = map.keySet();
            //遍历键的集合,获取到每一个键,用增强for实现
            for (String key : keySet) {
                String value= map.get(key);
                System.out.println(key+","+value);
            }
            System.out.println("+++++++++++++++++++++++++++++++");
            Set<Map.Entry<String, String>> entries = map.entrySet();
            for (Map.Entry<String, String> entry : entries) {
                String key= entry.getKey();
                String value=entry.getValue();
                if (value=="JSP"){
                    System.out.println("JSP老师:"+key);
                }
    
            }
    
  8. 模拟斗地主洗牌发牌(争取根据自己的思路在写一遍)
    /*
    1、分析:首先应准备牌:完成数字与纸牌的映射关系:使用双列Map(HashMap)集合,完成一个数字与字符串纸牌的对应关系。
    
         洗牌:通过数字完成洗牌发牌(借助工具类)
    
         发牌:将每个人以及底牌设计,将最后3张牌直接存放于底牌,剩余牌通过对3取模依次发牌给3个玩家。存放的过程中要求数字大小与斗地主规则的大小对应排序。将代表不同纸牌的数字分配给不同的玩家与底牌。
    
         看牌:通过Map集合找到对应字符展示。通过查询纸牌与数字的对应关系,由数字转成纸牌字符串再进行展示。*/
        
       
        public static void main(String[] args) {
            HashMap<Integer,String> poker=new HashMap<Integer,String>();
            String [] images={"♥","♠","♣","♦"};
            String [] logos={"3","4","5","6","7","8","9","10","J","Q","K","A","2"};
            ArrayList<Integer> indexs=new ArrayList<>();
    
            int index=0;
            //制作牌面
            for (String image : images) {
                for (String logo : logos) {
                    poker.put(index,image+logo);
                    indexs.add(index);
                    index++;
                }
            }
            //制作大小王
            poker.put(index,"大王");
            indexs.add(index++);
    
            poker.put(index,"小王");
            indexs.add(index);
    
            //创建三个人
            TreeSet<Integer> jia=new TreeSet<>();
            TreeSet<Integer> lin=new TreeSet<>();
            TreeSet<Integer> xue=new TreeSet<>();
            TreeSet<Integer> baseFaker=new TreeSet<>();
    
            //洗牌
            Collections.shuffle(indexs);
    
            for (int i = 0; i <indexs.size(); i++) {
                if (i>indexs.size()-3){
                    baseFaker.add(indexs.get(i));
                } else if (i%3==0) {
                    jia.add(indexs.get(i));
                }else if (i%3==1) {
                    lin.add(indexs.get(i));
                }else if (i%3==2) {
                    xue.add(indexs.get(i));
                }
            }
    
    
            //三人看牌
            lookPoker("贾宝玉",jia,poker);
            lookPoker("林黛玉",lin,poker);
            lookPoker("薛宝钗",xue,poker);
            lookPoker("底牌",baseFaker,poker);
        }
    
        public static void lookPoker(String name, TreeSet<Integer> indexs,HashMap<Integer,String> poker){
            System.out.println(name+"的牌为:");
            for (Integer index : indexs) {
                System.out.print(poker.get(index)+" ");
            }
            System.out.println();
        }
    
  9. 1】将以下车站对应关系的数据存储到map集合中,
    key:表示站编号,value:表示站名,
    并遍历打印(可以不按顺序打印)------------------------------------    
         站编号和站名对应关系如下:
        1 朱辛庄
    	2 育知路
    	3 平西府
    	4 回龙观东大街
    	5 霍营
    	6 育新
    	7 西小口
    	8 永泰庄
    	9 林萃桥
    	10 森林公园南门
    	11 奥林匹克公园
    	12 奥体中心
    	13 北土城
    	14 安华桥
    	15 安德里北街
    	16 鼓楼大街
    	17 什刹海
    	18 南锣鼓巷
        19 中国美术馆   
    ------------------------------------2】计算地铁票价规则:
    总行程 3站内(包含3站)收费3元,
    3站以上但不超过5站(包含5站)的收费4元,
    5站以上的,在4元的基础上,每多1站增加2元,
    10元封顶;
    
    需要对键盘录入的上车站
    和到达站进行判断,如果没有该站,
    提示重新输入,直到站名存在为止
    每站需要2分钟
    
    示范如下:
    -------------------------------------
    请输入上车站:
        流沙河
         
        您输入的上车站:流沙河站不存在,请重新输入上车站:
        骑龙
        
        您输入的上车站:骑龙站不存在,请重新输入上车站:
        朱辛庄
        您以确定在朱辛庄上站!
        
        请输入到达站:
        沙河
        
        您输入的到达站:沙河站不存在,请重新输入到达站:
        西二旗
         
        您输入的到达站:西二旗站不存在,请重新输入到达站:
        西小口
        您以确定在朱辛庄下站!
        
        从朱辛庄到西小口共经过6站收费6元,大约需要12分钟
    -----------------------------------------------
    
    
    public static void main(String[] args) {
            TreeMap<Integer,String> stations=new TreeMap<>();
            int index=1;
            TreeSet<String> addrs=new TreeSet<>();
            String [] addresses={"朱辛庄", "育知路", "平西府", "回龙观东大街", "霍营", "育新", "西小口", "永泰庄", "林萃桥",
                    "森林公园南门", "奥林匹克公园", "奥体中心", "北土城", "安华桥", "安德里北街", "鼓楼大街", "什刹海",
                    "南锣鼓巷", "中国美术馆"};
            for (String address : addresses) {
                stations.put(index,address);
                index++;
            }
    
            //定义站名
            int startIndex=0;
            int endIndex=0;
            int passStation=0;
    
            //输入站名
            boolean flag=true;
            while(flag){
                System.out.println("请输入上车站名:");
                Scanner sc=new Scanner(System.in);
                String startStation =sc.nextLine();
                if (isExist(startStation,stations)){
                    System.out.println("您已确定上车!");
                    while(true){
                        System.out.println("请输入目的站:");
                        String endStation=sc.nextLine();
                        if (isExist(endStation,stations)){
                            //System.out.println("您应付的车费为:");
                            startIndex=countStation(startStation,stations);
                            endIndex=countStation(endStation,stations);
                            //计算经过的中站
                            passStation=startIndex>endIndex?startIndex-endIndex:endIndex-startIndex;
                            int money=countMoney(passStation);
                            System.out.println("中途经过"+passStation+"站");
                            System.out.println("您应付的车费为:"+money);
                            return;
                        }else {
                            System.out.println("站名不存在请重新输入!");
                        }
                    }
    
                }else {
                    System.out.println("站名不存在请重新输入!");
                    continue;
                }
            }
    
    
    
        }
    
        //判断是否存在
        public static boolean isExist(String addr,TreeMap<Integer,String> stations){
            if (stations.containsValue(addr)){
                return true;
            }
            return false;
        }
    
        //计算车费
        public static int countStation(String addr,TreeMap<Integer,String> station){
            int goal=0;
            if (station.containsValue(addr)){
                Set<Map.Entry<Integer, String>> entrySet = station.entrySet();
                for (Map.Entry<Integer, String> entry : entrySet) {
                    int key=entry.getKey();
                    String startValue=entry.getValue();
                    if (startValue.equals(addr)){
                        goal=key;
                    }
                }
            }
            return goal;
        }
    
        //计算车费
        public static int countMoney(int total){
            int money=0;
            if (total>0&&total<=3){
                money=3;
            }else if(total>3&&total<=5){
                money=4;
            }else if (total>8){
                money=10;
            }else if (total>5&&total<=8){
                money=(total-5)*2+4;
            }
            return money;
        }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值