【数据结构】Map与Set的简单使用

19 篇文章 2 订阅
订阅专栏

目录

🌟前言

🌟Map

✍1.Map是什么

✍2.Map的常用方法说明

✍3.Map的使用(重点是遍历方式)

🌟Set

✍Set的常见方法

✍Set的使用

 🌟相关OJ题

✍ 宝石与石头

✍ 坏键盘

✍ 复制带随机指针的链表


🐵今天的文章主要学习 Map和Set的基础语法,了解它们的特性。

🌟前言

        Map和Set是专门用来进行搜索的容器或者数据结构。其中,我们一般将搜索的数据称为关键字(Key),和关键字对应的称为值(Value),所以称其为Key-Value的键值对。所以一般分为两种模型:

(1)纯Key模型

比如:快速查找某个姓名在不在通讯录中,快速查找某个单词在不在字典中;

(2)Key-Value模型

比如:统计一段文本中每个字的出现次数,要求统计结果是<字,字出现的次数>;

那么Map中存储的就是Key-Value的键值对,而Set中存储的就是Key

好啦,知道了这些,我们现在开始愉快的学习下面两个知识点吧~😎

🌟Map

✍1.Map是什么

        Map是 一个接口类并没有继承Collection,该类存储的是<K,V>结构的键值对并且Key一定是唯一的,不可以重复。具体看下面这张结构关系表(黄色表示接口类型):

✍2.Map的常用方法说明

主要使用的方法就是put,  getOrDefault   和 Set<Map.Entry<K,V>> entrySet()。

 其他:

(1)Map是一个接口,不能直接实例化对象;如果要实例化对象只能实例化其实现类HashMap(哈希桶)或者TreeMap(红黑树)。

(2)Map中的Key值是唯一的,但是Value可以是重复的;

(3)在TreeMap中插入键值对时,key不能为空,否则就会抛NullPointerException异常,value可以为空。但是HashMap的key和value都可以为空。

(4)Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
(5)Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(因为value可能有重复)。

(6)Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。

✍3.Map的使用(重点是遍历方式)

(1)Map的遍历方式:

🌸 打印所有的键值对

    🌸 打印所有的Key:

   🌸 打印所有的Value:

 (2)如果修改 当前entry中的Value值,会同步修改Map中的值。 


🌟Set

✍Set的常见方法

Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。

        Set的常用方法主要有add:需要知道与Map不同的是,添加元素时,如果是重复元素,则不会被添加成功。

注意:        
        1. Set是继承自Collection的一个接口类;
        2. Set中只存储了key,并且要求key一定要唯一;

        3. TreeSet的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的;
        4. Set最大的功能就是对集合中的元素进行去重
    5. 实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序。(LinkedHashSet的添加顺序与存储顺序是一致的,TreeSet是不一致的。
        6. Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入;
        7. TreeSet中不能插入null的key,HashSet可以;

✍Set的使用


 🌟相关OJ题

✍ 宝石与石头

(1)问题描述:给你一个字符串 jewels 代表石头中宝石的类型,另有一个字符串 stones 代表你拥有的石头。 stones 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。字母区分大小写,因此 "a" 和 "A" 是不同类型的石头。

(2)主要思路: 

        题目说的这么花哨,但是其实问题简化就是两个字符串,第一个字符串的每个字符就是一种类型,判断第二个字符串中每个字符是否属于第一个字符串中的字符,如果是的话,使用计数器计数即可。当然这里计数的时候可能会出现相同字符重复计数,所以使用Set的去重特性

(3)代码实现

    public int numJewelsInStones(String jewels, String stones) {
        //先遍历jewels字符串,取出里面的宝石类型存储到Set接口中
        Set<Character> set = new HashSet<>();
        for (int i = 0; i < jewels.length(); i++) {
            set.add(jewels.charAt(i));
        }
        //再遍历stones字符串,判断里面的每个字符是否是Set中的宝石类型:是的话计数器+1,否则不操作
        int num = 0;
        for (int i = 0; i < stones.length(); i++) {
            if(set.contains(stones.charAt(i))){
                num++;
            }
        }
        return num;
    }

✍ 坏键盘

(1)问题描述:旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

(2)主要思路:

         该题其实和第一题的类型是一样的,简化就是有一个期望的字符串S1(表示希望的键盘输入),有一个实际的字符串S2(表示键盘实际输出的字符串),然后得出坏掉的键盘字符。有几个细节要注意:第一点:字符串中有大写和小写,但是最后结果只输出大写,所以这里要将所有的字符先转为大写字符;第二点就是每个字符只输出一次,所以这里用到的还是Set的去重特性第三点:要求输出结果是按照发现顺序输出的,所以这里要使用LinkedHashSet存储数据

        先将S1,S2字符串转为大写,遍历S2获取其中的每个字符保存在Set中;遍历S1,判断S1中的字符在Set中是否存在,不存在的就是坏掉的键盘。

(3)代码实现

     public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String expectedStr = in.nextLine().toUpperCase();
            String actualStr = in.nextLine().toUpperCase();
            // 1.使用Set集合存储实际的字符
            Set<Character> set = new HashSet<>();
            for(int i = 0;i < actualStr.length();i++) {
                set.add(actualStr.charAt(i));
            }
            // 2.拿着实际存在的字符Set扫描期望的字符串
            // 所谓的坏键就是期望中存在的字符,set中没有的字符
            Set<Character> badKey = new LinkedHashSet<>();
            for(int i = 0;i < expectedStr.length();i++) {
                char c = expectedStr.charAt(i);
                if(!set.contains(c)) {
                    badKey.add(c);
                }
            }
            // 最终将badKeySet中的每个字符输出一次
            for(char c : badKey) {
                System.out.print(c);
            }
            // 换行进行下一组数据的处理
            System.out.println();
        }
    }

 ✍ 复制带随机指针的链表(要掌握!)

(1)问题描述

        给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

(2)主要思路:参考题解

🌻 创建一个Map保存原链表的node和新链表对应的newNode;

🌻 需要清楚:       

        map.get(原节点),得到的就是对应的新节点
        map.get(原节点.next),得到的就是对应的新节点.next
        map.get(原节点.random),得到的就是对应的新节点.random

🌻 两者的关系:       
        新节点.next -> map.get(原节点.next)
        新节点.random -> map.get(原节点.random)

        新节点: map.get(原节点)
🌻 综合:         

        map.get(原节点).next -> map.get(原节点.next)

        map.get(原节点).random-> map.get(原节点.random)

​  (3)代码实现

`public Node copyRandomList(Node head) {
        //遍历原链表,构建新链表,保存在Map接口中
        Map<Node,Node> map = new HashMap<>();//Map接口的两个Node分别表示原链表的节点和新链表对应位置的节点
        Node temp = head;
        while (temp != null){
            Node node = new Node(temp.val);//每走到一个节点,创建一个新节点
            map.put(temp,node);//将原节点和对应位置的新节点存储到map中
            temp = temp.next;
        }
        //此时map中已经保存了原链表和新链表两两对应位置的节点
        temp = head;//重新从链表头部开始,建立节点的next引用以及random关系
        while (temp!=null){
            map.get(temp).next = map.get(temp.next);//next 引用
            map.get(temp).random = map.get(temp.random);//random引用
            temp = temp.next;
        }
        return map.get(head);//通过原链表的头结点找到新链表的头结点
    }

MapSet详细介绍~
qq_57603004的博客
03-24 4511
MapSet详细介绍~
Mapset使用----Map
weixin_47786582的博客
05-14 142
以前常见的 搜索方式有:1.直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢2.二分查找,时间复杂度为 log N ,但搜索前必须要求序列是有序的上述排序比较适合静态类型的查找,即一般不会对区间进行插入和删除操作了,而现实中的查找比如:1.根据姓名查询考试成绩2.通讯录,即根据姓名查询联系方式3.不重复集合,即需要先搜索关键字是否已经在集合中可能在查找时进行一些插入和删除的操作,即动态查找,那上述两种方式就不太适合了,本节介绍的MapSet
setmap使用
weixin_54217534的博客
06-30 416
Set对象是一些元素的集合(看到集合,我们就会联想到集合内的元素都是不重复),如果你在Set中添加已存在的元素,该元素不会被添加说明:若添加的是对象或者数组,则是看添加的是否是指向同一地址,若不是指向同一块地址,则可以都添加进去2.Set对象的方法 运行结果如下: 运行结果如下:map对象和set对象的方法大致相同,map对象中的键值是有序的 运行结果如下: 运行结果如下: 运行结果如下: NaN也可以作为Map对象的键,虽然NaN和任何值都是不相等的,但两个NaN作为键名来说是没有
SetMap基本用法
何子的博客
12-02 730
一、Set Set本身是一种构造函数,用来生成Set数据结构 var s = new Set(); var arr = [1,2,1,3,4,3,2,5,5]; arr.map(x => s.add(x));// 使用add方法向Set增加数据 for(let i of s){ console.log(i) } 1 2 3 4 5//=》自带去重功能 var arr = new Set([1,2,3,4,5,'5',6,7,7,7]) arr.size//=》8,Set中5和'5'是不同的
mapset介绍及使用
qzt__l0ve的博客
07-10 552
在了解mapset之前,你肯定已经使用过vector、list、deque、forward_list(C++11)等这些容器,而他们统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。而关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器的效率更高。键值对:用来表示具有一一对应关系的一种结构,该结构中一般只包含两个成员变量key和value,key代表键值,value表示与key对应的信息。
ES6中SetMap数据结构Map与其它数据结构互相转换操作实例详解
10-17
主要介绍了ES6中SetMap数据结构Map与其它数据结构互相转换操作,结合实例形式详细分析了ES6中的SetMap数据结构的概念、原理、遍历、去重等操作,以及Map与其它数据结构互相转换操作,需要的朋友可以参考下
详解ES6中的 Set Map 数据结构学习总结
10-17
主要介绍了详解ES6中的 Set Map 数据结构学习总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
笔记11-数据结构MAPSET
最新发布
12-14
笔记11-数据结构MAPSET
ES6新特性五:SetMap数据结构实例分析
08-30
主要介绍了ES6新特性五之SetMap数据结构,结合实例形式分析了ES6中SetMap的功能、定义、属性、结构与相关使用技巧,需要的朋友可以参考下
setmap使用
ych9527的博客
05-24 651
文章目录1.关联式容器2.键值对3.树形结构的关联式容器4.set使用介绍4.1set的模板参数4.2使用介绍4.2.1排序和去重4.2.2查找5.map使用介绍5.1模板参数5.2元素插入5.3元素的交换5.4排序、去重、统计次数5.5查找5.6删除5.7[]原理5.8map实际应用6.multiset、multimap6.1实际应用 1.关联式容器 vector、list、deque等容器被称之为序列式容器,因为它们的底层为线性序列的数据结构,里面存储的是元素的本身 关联式容器也是用来存储数据的,与
mapset使用
sqjddb的博客
03-03 559
一、关联式容器 键值对 二、pair 和 make_pair 三、K模型 & KV模型 四、set 五、map
一文学懂MapSet——详解
噜噜噜噜鲁
11-09 1487
MapSet是一种专门用来搜索的容器或者数据结构,其搜索的效率与具体的实例化子类有关。一般的查找如二分查找,它适合静态类型的查找,即就是不进行插入、删除操作。但现实中,如根据学号查找学生姓名,这种查可能会在查找时进行插入或删除操作,二分查找就不适用了。Map就是一个数据对应于另一个数据,如学号与姓名是一一对应的、身份证与某个人是一一对应的Set就像是一个集合,它里面存放一组不重复的数据。
【STL】mapset的基本用法
皓皓松的博客
02-17 2076
pair 简介: pair是一个模板类,有两个模板参数,分别为 first 和 second; 定义: template struct pair; 模拟实现: template struct Pair { typedef T1 first_type; typedef T2 second_type; T1 first; T2 second; Pair() :first_
MapSet的介绍与应用
m0_61761695的博客
09-15 449
TreeMap TreeSet HashMap HashSet,应用,数据结构,算法,知识点
setmap用法简介
Sunnylunch-blog
11-13 1092
在介绍容器之前,我们先来介绍一下pair,pair是一种模板类型,每个pair可以存储两个值,这两个值的类型可以是任何类型的。它定义在#include 中。 可以看到,pair的两个成员分别是first和second。 一、set(集合):     set是一种key结构,它的元素就是它的键值,set不允许有两个相同的键值,set中的所有元素的键值都会自动被排序。set
Java SetMap基本用法总结
FreeGo~
03-23 542
java set 用 add添加 size大小 for each遍历 contains存在 java map 用 put添加 size大小 for each遍历 containsKey和containsValue和get(key)!=null存在 set获取元素,转为list List <A> list = new ArrayList<A>(B);//B是set型的 li...
MapSet接口的常用功能介绍
奋斗
03-22 671
MapSet接口 两者的存在意义❓ MapSet是一种专门用来进行搜索的容器,或者说数据结构,其搜索的效率与具体的实例化子类有关,在学习这两个搜索容器之前,我们所熟知的所搜方式比如有: 直接遍历查找 时间复杂度为O(n),元素越多,遍历就会越慢 二分查找 时间复杂度为O(logn),并且二分查找之前,数组还必须已经是有序了,那这个限制就比较大了 其次上述两种排序,比较适合静态的查找,即在查找过程中最好不要对一份数据进行插入或者删除,但现实是有很多数据时查找的过程中,对数据都会有多多少少的进行
数据结构MapSet详解
m0_71731682的博客
09-12 2866
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以纯 key 模型,比如:有一个英文词典,快速查找一个单词是否在词典中快速查找某个名字在不在通讯录中Key-Value 模型,比如:统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号而Map中存储的就是key-value的键值对Set中只存储了Key。
set数据结构基础学习笔记
weixin_67991858的博客
12-13 1045
set又叫集合,它是⼀个十分重要的数据结构。它行为与数据结构列表数据结构相似,不同之处在于区别在于set包含重复的值。下面我们一起来看看set数据结构的概念、使用场景以及数学运算,总结梳理一下set数据结构的基础学习笔记。set(集合)是一组无重复无序的数据,就像数学中集合的概念。它没有标准的括号包裹,[]表示list,()表示tuple,{}表示dict。但是我们可以用带值的大括号来定义。以上就是set数据结构基础学习笔记,大家都掌握了吗?
js MapSet数据结构
07-27
JS中的MapSet是两种常用的数据结构Map是一种键值对的集合,其中每个键都是唯一的。可以通过键来访问和修改对应的值。Map可以使用任何类型的值作为键,包括基本类型和对象引用。Map的遍历顺序是按照插入顺序...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Pytorch中nn.Parameter()参数的使用 13162
  • 【数据结构】哈希表 5776
  • 【MySQL】数据库基础操作一:建库与建表 3960
  • 【HTTP】HTTP协议 && HTTPS 协议 3956
  • A Simple Framework for Contrastive Learning of Visual Representations 3330

分类专栏

  • JavaSE 2篇
  • 每日编程 9篇
  • MySQL 5篇
  • 数据结构 19篇
  • JavaEE初阶 22篇
  • 测试学习 10篇
  • 突如其来的BUG 2篇
  • 打怪升级之路
  • Spring学习 14篇
  • 科研记录 6篇
  • C语言 5篇

最新评论

  • 个人博客论坛系统测试报告

    维也纳艺术家: 表情包

  • 【MySQL】数据库基础操作一:建库与建表

    zxfcs628: 谢谢

  • 个人博客论坛系统测试报告

    陌上 烟雨齐: 写的太好了。

  • 【Spring Boot学习一】创建项目 && Spring Boot的配置文件

    手插口袋谁也不爱♡: 写的好好,关注了

  • 【HTTP】HTTP协议 && HTTPS 协议

    Lion Long: 文章写得很好,初来乍到,希望多多关注。期待更多文章!

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • 个人博客论坛系统测试报告
  • 【Selenium学习】环境搭建 && API学习
  • 【MySQL安装】卸载与安装MySQL 5.7.X版本
2023年86篇
2022年11篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

深圳SEO优化公司阳泉关键词排名推荐洛阳关键词按天收费本溪品牌网站设计报价宝安SEO按天收费哪家好北海关键词按天计费多少钱大同企业网站制作多少钱东营模板网站建设推荐龙岩网站优化排名济南外贸网站建设多少钱榆林建设网站哪家好徐州网站建设公司伊犁seo排名价格鸡西关键词按天收费福田SEO按天计费公司庆阳模板制作多少钱普洱网站关键词优化公司坑梓营销网站公司海西模板推广公司阿里百度竞价公司佛山网络推广报价鹰潭优秀网站设计推荐泰安网页制作报价景德镇企业网站设计哪家好郑州优秀网站设计公司佛山外贸网站制作报价宿迁建站多少钱黄冈SEO按天收费公司淮北关键词按天收费价格深圳百度爱采购公司宜昌网站改版哪家好歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化