Map和Set

1、搜索

1.1概念

Map和Set是一种专门用来搜索的容器或者数据结构,其搜索的效率与具体的实例化子类有关。

1.2模型

一般把搜索的数据叫关键字(key),和关键字对应的值成为值(value),这就称为key-value的键值对,所以模型会有两种:

①纯key 模型:有一个字典,查找某个字是否存在,此时单纯的搜索用set

②key-value 键值对模型:统计文件中某个单词出现的次数,统计的结果都应该包含:单词+出现的次数 <单词,出现的次数>,此时就用Map

2、Map的常见操作

a.添加操作(put)

 Map<String,String> map = new HashMap<>();
        //添加元素
        map.put("宋江","及时雨");
        map.put("李逵","黑旋风");
        map.put("吴用","智多星");

若key不存在则将key-value添加到map中,若已经存在,则会覆盖掉原先的数据,显示新的key-value:

map.put("宋江","及时雨");
        map.put("李逵","黑旋风");
        map.put("吴用","智多星");
        map.put("吴用","军师");

b.根据key 取得value(get)

①get(key):根据key 取得 value,若key不存在,则返回null

②getOrDefault(key):根据key返回value,若key不存在,则返回设置的默认值

System.out.println(map.get("宋江"));//->及时雨
        System.out.println(map.get("鲁智深"));//-> null
        System.out.println(map.getOrDefault("鲁智深","花和尚"));

c.删除(remove) 返回键值对的value值

 System.out.println(map.remove("宋江")); //->及时雨

d.遍历(一般不用),要遍历map集合,就需要把Map转为Set集合(因为Collection接口及其子类中实现了for-each循环遍历,但是Map集合跟Collection集合毫无关系),然后进行遍历操作,用方法Map.Entry来实现,就相当于把Map中的键值对包装起来放进Set集合中

        map.put("宋江","及时雨");
        map.put("李逵","黑旋风");
        map.put("吴用","智多星");
        //遍历操作
        //需要将Map转为Set<Map.Entry>
        //Map->Set
        Set<Map.Entry<String,String >> entries = map.entrySet();
        //for-each遍历Set集合
        for (Map.Entry<String ,String > entry:entries){
            System.out.println(entry.getKey()+"="+entry.getValue());
        }

e.Map集合的搜索※

contains方法再Map中是非常高效的,HasMap中接近O(1),TreeMap中接近O(logn)

 System.out.println(map.containsKey("宋江"));
 System.out.println(map.containsValue("及时雨"));

3、Set的使用

Set集合的使用,等同于List,都是Collection的子接口,最常使用Set集合的场景,用在元素去重!!

例题:136. 只出现一次的数字 - 力扣(LeetCode) (leetcode-cn.com)

           138. 复制带随机指针的链表 - 力扣(LeetCode) (leetcode-cn.com)

           771. 宝石与石头 - 力扣(LeetCode) (leetcode-cn.com)

            旧键盘 (20)__牛客网 (nowcoder.com)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值