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

news/2024/11/2 8:31:32/

今天带来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.ppmy.cn/news/1543815.html

相关文章

ATom:加州理工学院(CIT)化学电离质谱仪(CIMS)测量的气相有机和无机分析物的浓度CIT-CIMS

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATom: In Situ Data from Caltech Chemical Ionization Mass Spectrometer (CIT-CIMS), V2 简介 Caltech Chemical Ionization Mass Spectrometer (CIT-CIMS), V2是一种用于收集原位数据的质谱仪。…

Llama 3.2 Vision Molmo:多模态开源生态系统基础

编者按&#xff1a; 视觉功能的融入对模型能力和推理方式的影响如何&#xff1f;当我们需要一个既能看懂图像、又能生成文本的 AI 助手时&#xff0c;是否只能依赖于 GPT-4V 这样的闭源解决方案&#xff1f; 我们今天为大家分享的这篇文章&#xff0c;作者的核心观点是&#xf…

Vmos pro-虚拟机 解锁永久vip

[应用名称] 应用名称&#xff1a;Vmos pro [应用版本] 应用版本&#xff1a;2.99 [软件大小] 软件大小&#xff1a;32.2mb [应用简介] 应用简介&#xff1a;Vmos Pro这款安卓虚拟机平台&#xff0c;提供了多样化的ROM版本选择。用户可根据自身需求更换ROM&#xff0c;调…

力扣hot100-->位运算

目录 位运算 1. 136. 只出现一次的数字 2. 338. 比特位计数 3. 461. 汉明距离 位运算 1. 136. 只出现一次的数字 简单 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设…

【Nginx系列】Nginx 中的`proxy_set_header`指令:Host 字段的区别与联系

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

pycharm小游戏飞机射击

导入pygame模块 下载成功 图片略显粗糙 python 复制 import pygame import random # 初始化 pygame pygame.init() # 屏幕大小 SCREEN_WIDTH 800 SCREEN_HEIGHT 600 # 颜色 WHITE (255, 255, 255) BLACK (0, 0, 0) GREEN (0, 255, 0) RED (255, 0, 0) # 飞机速度 P…

8.3.2 前向分步算法与 AdaBoost

由前向分步算法可以推导出 AdaBoost&#xff0c;用定理叙述这一关系。   定理 8.3  AdaBoost 算法是前向分步加法算法的特例。 这时&#xff0c;模型是由基本分类器组成的加法模型&#xff0c;损失函数是指数函数。   证明 前向分步算法学习的正加法模型&#xff0c;当基…

自动驾驶---理想汽车智驾进展

1 背景 自媒体---“电车通”从2024年初开始推出智能化评测相关栏目&#xff0c;尤其是针对智能驾驶这一功能做了大量的实测工作&#xff1b;根据综合表现&#xff0c;给测试车型给出了能够直观展示其能力的评分。当评测的对象达到一定数量后&#xff0c;对整个国内车市智驾能力…