数据结构————map,set详解

news2024/11/28 4:32:47

今天带来map和set的详解,保证大家分清楚

一,概念

map和set是一种专门用来搜索的容器或数据结构

map能存储两个数据类型,我们称之为<key-value>模型

set只能存储一个数据类型,我们称之为纯<key>模型

它们的效率都非常非常高,我们来一个一个了解。

二,详解map

1,map的说明

map是一个接口,所以我们不能直接创建map对象,我们可以使用Treemap和HashMap,我们先不讲treemap和Hashmap底层是怎么实现的,我们先只需要了解他们怎么使用就行(后期还是要学),treeMap的底层是使用红黑树来实现的,而Hashmap底层是哈希表,哈希表由一系列哈希桶组层,也很难,后期要掌握。

2,map中的具体方法

V put(K key, V value)  设置 key 对应的 value

开头V的意思是返回value的类型。

这个方法是添加元素,注意,实现的对象在treemap的时候k是不可以存null的,而Hashset是可以存null的,因为treemap底层的红黑树涉及比较,而Hashset主要是根据哈希函数查找,

key值如果相同的话,后添加的会把map中已经存在的key值对应的value覆盖掉,而不同key值间的value是可以相同的。


        Map<String,Integer> map = new HashMap<>();
        map.put("ujm",12321);
        map.put("abs",12321);
        map.put("tdh",12321);
        map.put("yre",12321);

 我们来向map中添加键值对,来调试

成功添加了键值对。

V remove(Object key)   删除 key 对应的映射关系 

map中的删除方法,map中的key值是不可以修改的,只能进行删除操作,之后再重新修改。

        map.remove("ujm");
        map.remove("abs");
        map.remove("tdh");
        map.remove("yre");
      

我们看到了map中不含任何元素了。

V get(Object key)   返回 key 对应的 value

我们使用get方法来获取key———对应的value值,就是我们的查找了。

我们查找刚才添加元素的abs.

int a = map.get("abs");
        System.out.println(a);

 

我们成功找到了abs字符串

V getOrDefault(Object key, V defaultValue)  返回 key 对应的 value,key 不存在,返回默认值

但是我们这次如果没有找到对应的key,就返回我们设定的值

int a = map.getOrDefault("bswr",1000);
        System.out.println(a);

 

Set keySet()返回所有 key 的不重复集合

我们用keySet()方法来获得map中的所有key

Map<String,Integer> map = new HashMap<>();
        map.put("ujm",12321);
        map.put("abs",12321);
        map.put("tdh",12321);
        map.put("yre",12321);
        Set<String> set = map.keySet();

 

那么value呢 

Collection values()返回所有 value 的可重复集合  

我们用这个方法来获得所有的value

Map<String,Integer> map = new HashMap<>();
        map.put("ujm",12321);
        map.put("abs",12321);
        map.put("tdh",12321);
        map.put("yre",12321);
        Collection<Integer> collection = map.values();

 

Map.Entry<k,v>

这是map中提供的一个获取键值对的类,我们可以通过这个类来获得k,v的值,我们还可以将v替换成其他的v值,我们经常使用这个类来遍历的打印键值对。

这个类中有三个方法,

K getKey()  返回 entry 中的 key

V getValue()  返回 entry 中的 value 

V setValue(V value) 将键值对中的value替换为指定value

这里先不介绍。

Set<Map.Entry<k,v>> entrySet()  返回所有的 key-value 映射关系 

我们创建一个set类型,Set类型的具体数据类型是我们的键值对类型,我们对map进行.entry Set() 传给我们的set类型,我们就得到我们所有的键值对关系,这个是最重要的。

 Map<String,Integer> map = new HashMap<>();
        map.put("ujm",4647);
        map.put("abs",123);
        map.put("tdh",1351);
        map.put("yre",6856);
        Set<Map.Entry<String,Integer>> set = map.entrySet();
        for (Map.Entry<String,Integer> entry1 : set){
            System.out.println(entry1);
        }

 我们使用for each遍历,

成功打印所以的键值对。

boolean containsKey(Object key) 判断是否包含 key

在map中找key,找到返回true,没有返回false

   boolean a = map.containsKey("abs");
        System.out.println(a);
        a = map.containsKey("scawcw");
        System.out.println(a);

 

boolean containsValue(Object value)判断是否包含 value 

在map中找value,找到返回true,没有返回false

 boolean b = map.containsValue(123);
        System.out.println(b);
        b = map.containsValue(213124);
        System.out.println(b);

 

 

Map底层结构TreeMapHashMap
底层结构红黑树哈希桶
插入/删除/查找时间 复杂度O(log2n)O(1)
是否有序关于key有序无序
线程安全不安全不安全
插入/删除/查找区别需要进行元素比较需要哈希函数计算地址
比较与覆写不可以放null会抛异常需要覆写HashCode和equals函数
应用场景key有序最好不关心,开辟大量内存换取时间

 三,详解set

1.set的说明

Set也是一个接口,我们要想创建对象就要使用TreeSet,HashSet,Set是纯key模型,不能重复,我们常常使用Set来去重。

2.set中的具体方法

boolean add(E e) 添加元素,但重复元素不会被添加成功

向set中添加元素,set中的key不能重复

Set<Integer> set = new HashSet<>();
        set.add(13);
        set.add(46);
        set.add(768);

 

我们看到set中成功添加了三个元素

void clear()   清空集合

set.add(13);
        set.add(46);
        set.add(768);
        set.add(2);
        set.clear();

 

boolean contains(Object o)   判断 o 是否在集合中 

        Set<Integer> set = new HashSet<>();
        set.add(13);
        set.add(46);
        set.add(768);
        set.add(2);
        boolean a = set.contains(12);
        boolean b = set.contains(2);
        System.out.println(a + "   " + b);

boolean remove(Object o)

set.remove(13);

移除13。

Iterator iterator() 返回迭代器

这个方法我们主要用来遍历打印我们的Set,因为set实现了我们的Iterator接口

Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

 

其他方法

 

 

Set底层结构TreeSetHashSet
底层结构红黑树哈希桶
插入/删除/查找时间 复杂度O(log2n)O(1)
是否有序关于key有序无序
线程安全不安全不安全
插入/删除/查找区别需要进行元素比较需要哈希函数计算地址
比较与覆写不可以放null会抛异常需要覆写HashCode和equals函数
应用场景key有序最好不关心,开辟大量内存换取时间

四,练题

好了,终于讲完我们的基础了,我们来三道小练习题

1给一组元素,统计元素出现的次数
2给定一组元素去重
3找到一组数据中第一个重复的数据

1, 给一组元素,统计元素出现的次数

        int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};
        Map<Integer,Integer> map = new HashMap<>();
        for (int i = 0; i < arr.length; i++) {
            if(map.get(arr[i])==null){
                map.put(arr[i],1);
            }
            else {
                map.put(arr[i], map.get(arr[i])+1);
            }
        }

        Set<Map.Entry<Integer,Integer>> set = map.entrySet();
        for (Map.Entry<Integer,Integer> entry: set){
            System.out.println(entry);
        }

2,给定一组元素去重

int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < arr.length; i++) {
            set.add(arr[i]);
        }

        Iterator<Integer> iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

 3,找到一组数据中第一个重复的数据

int[] arr = new int[]{23,352,46,47,84,1,44,6,1,23};
        Set<Integer> set = new HashSet<>();
        for (int i = 0; i < arr.length; i++) {
            if (!set.contains(arr[i])){
                set.add(arr[i]);
            }
            else {
                System.out.println(arr[i]);
                return;
            }
        }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2227702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

APISQL企业版离线部署教程

针对政务、国企、医院、军工等内网物理隔离的客户&#xff0c;有时需要多次摆渡才能到达要安装软件的服务器。本教程将指导您使用Linux和Docker Compose编排服务&#xff0c;实现APISQL的离线部署。 准备 准备一台Linux(x86_64)服务器。 安装Docker Engine&#xff08;推荐版本…

DC-1渗透测试

DC1 五个flag的拿取&#xff08;截图是五个flag里面的内容&#xff09; 注意事项&#xff1a;kali的用户名&#xff1a;root 密码&#xff1a;kali 注意&#xff1a;DC1 只要开机服务就起来了 思路&#xff1a;信息收集—> 寻找漏洞—> 利用漏洞(sql注入,文件上传漏洞…

uniapp的IOS证书申请(测试和正式环境)及UDID配置流程

1.说明 本教程只提供uniapp在ios端的证书文件申请&#xff08;包含正式环境和开发环境&#xff09;、UDID配置说明&#xff0c;请勿用文档中的账号和其他隐私数据进行测试&#xff0c;请勿侵权&#xff01; 2.申请前准备 证书生成网站&#xff1a;苹果应用上传、解析&#x…

vxe-table 表格中使用输入框、整数限制、小数限制,单元格渲染数值输入框

Vxe UI vue vxe-table 表格中使用输入框、整数限制、小数限制&#xff0c;单元格渲染数值输入框 在 vxe-table v4.7 单元格中渲染有非常多的方式&#xff0c;可以使用自带的组件&#xff0c;也可以已使用第三方的组件 element ui 之类的。本章介绍如果使用自带的输入框&#x…

Negative Sampling in Recommendation: A Survey and Future Directions

目录 Introduction分类&#xff1a;静态负采样策略动态负采样策略对抗负采样策略重要性重加权策略知识增强负采样策略多种推荐场景的负采样 Introduction 传统的推荐算法通常关注用户的正面历史行为&#xff0c;而忽视了负面反馈在理解用户兴趣中的重要作用。负面采样是推荐系…

Java IO 模型

I/O 何为 I/O? I/O&#xff08;Input/Output&#xff09; 即输入&#xff0f;输出 。 我们先从计算机结构的角度来解读一下 I/O。 根据冯.诺依曼结构&#xff0c;计算机结构分为 5 大部分&#xff1a;运算器、控制器、存储器、输入设备、输出设备。 输入设备&#xff08;比…

MFC实现以不规则PNG图片作为窗口背景

效果图 显示的不规则PNG图片 头文件 #pragma once #include <gdiplus.h> #pragma comment (lib,"Gdiplus.lib")// CShowBack 对话框class CShowBack : public CDialogEx {DECLARE_DYNAMIC(CShowBack) public:CShowBack(CWnd* pParent nullptr); // 标准构…

数字IC开发:布局布线

数字IC开发&#xff1a;布局布线 前端经过DFT&#xff0c;综合后输出网表文件给后端&#xff0c;由后端通过布局布线&#xff0c;将网表转换为GDSII文件&#xff1b;网表文件只包含单元器件及其连接等信息&#xff0c;GDS文件则包含其物理位置&#xff0c;具体的走线&#xff1…

HarmonyOS 5.0应用开发——Navigation实现页面路由

【高心星出品】 文章目录 Navigation实现页面路由完整的Navigation入口页面子页面 页面跳转路由拦截其他的 Navigation实现页面路由 Navigation&#xff1a;路由导航的根视图容器&#xff0c;一般作为页面&#xff08;Entry&#xff09;的根容器去使用&#xff0c;包括单页面&…

Flink CDC系列之:学习理解核心概念——Data Pipeline

Flink CDC系列之&#xff1a;学习理解核心概念——Data Pipeline 数据管道sourcesink管道配置Table IDroutetransform案例 数据管道 由于 Flink CDC 中的事件以管道方式从上游流向下游&#xff0c;因此整个 ETL 任务被称为数据管道。 管道对应于 Flink 中的一系列操作。 要描…

25届电信保研经验贴(清华大学电子工程系,工程硕博)

个人背景 学校&#xff1a;中九 专业&#xff1a;电子信息工程 加权&#xff1a;92.89 绩点&#xff1a;3.91/4.0 rank&#xff1a;前五学期rank2/95&#xff0c;综合排名rank1&#xff08;前六学期和综合排名出的晚&#xff0c;实际上只用到了前五学期&#xff09; 科研…

安卓取消触摸屏幕的指针效果

在安卓系统中&#xff0c;取消触摸屏幕的指针效果&#xff08;通常指开发者模式下的屏幕点按反馈显示或指针位置显示&#xff09;可以通过ADB&#xff08;Android Debug Bridge&#xff09;命令来实现。以下是具体的步骤和命令&#xff1a; 使用ADB命令取消触摸屏幕的指针效果 …

数据库基础介绍

前言&#xff1a; 在当今信息化、数字化的时代&#xff0c;数据库是支撑一切信息系统的核心基础设施。无论是金融机构的账户管理、电商平台的商品库存&#xff0c;还是社交媒体的用户信息&#xff0c;数据库都在背后扮演着关键角色数据库不仅用于存储和管理数据&#xff0c;更…

使用AMD GPU和LangChain构建问答聊天机器人

Question-answering Chatbot with LangChain on an AMD GPU — ROCm Blogs 作者&#xff1a;Phillip Dang 2024年3月11日 LangChain是一个旨在利用语言模型强大功能来构建前沿应用程序的框架。通过将语言模型连接到各种上下文资源并基于给定的上下文提供推理能力&#xff0c;L…

一篇文章总结 SQL 基础知识点

1. 官方文档 MySQL&#xff1a;https://dev.mysql.com/doc/refman/8.4/en/ SQL Server&#xff1a;What is SQL Server? - SQL Server | Microsoft Learn Oracle&#xff1a;https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loe.html 2. 术语 SQL S…

【Java数据结构】树】

【Java数据结构】树 一、树型结构1.1 概念1.2 特点1.3 树的类型1.4 树的遍历方式1.5 树的表示形式1.5.1 双亲表示法1.5.2 孩子表示法1.5.3 孩子双亲表示法1.5.4 孩子兄弟表示法 二、树型概念&#xff08;重点&#xff09; 此篇博客希望对你有所帮助&#xff08;帮助你了解树&am…

【MyBatis源码】SqlSource对象创建流程

文章目录 介绍XMLScriptBuilder初始化parseDynamicTags解析动态节点RawSqlSource分析代码分析实例化 介绍 代码入口&#xff1a; SqlSource sqlSource langDriver.createSqlSource(configuration, context, parameterTypeClass);languageRegistry&#xff1a;用于注册Langua…

centos下面的jdk17的安装配置

文章目录 1.基本指令回顾2.jdk17的安装到这个centos上面2.1首先切换到这个root下面去2.2查看系统jdk版本2.3首先到官网找到进行下载2.4安装包的上传2.5jdk17的安装包的解压过程2.6配置环境变量2.7是否设置成功&#xff0c;查看版本 1.基本指令回顾 ls:list也就是列出来这个目录…

基于Multisim的数字温度计设计与仿真

1.设计测量范围为 0℃到 99℃的数字温度计 2.可实时显示温度 3.精度误差小于 1℃ 4.LED 数码直读显示温度大小 链接&#xff1a;https://pan.baidu.com/s/1isIHpMESTBTf2T2SY9-iPw 提取码&#xff1a;qh4o

明日周刊-第25期

十月的最后几天了&#xff0c;将要迎来十一月。冬天快乐 文章目录 科技短讯AI珠宝设计平台Meta AI获准使用路透社新闻OpenAI&#xff1a;今年不会发布“Orion”模型谷歌音乐AI创作工具Meta上线AI播客生成器&#x1f4f1;科技大厂Waymo完成5.6亿美元新融资波音考虑出售航天业务苹…