集合 Map

本文详细介绍了Map集合的概念及其在Java中的实现形式,包括Hashtable、HashMap和TreeMap的特点与使用方法,并探讨了从Map集合中获取数据的两种方式。


 

 

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
 1,添加。
  put(K key, V value)
  putAll(Map<? extends K,? extends V> m)

 2,删除。
  clear()
  remove(Object key)

 3,判断。
  containsValue(Object value)
  containsKey(Object key)
  isEmpty()


 4,获取。
  get(Object key)
  size()
  values()

  entrySet()
  keySet()

Map
 |--Hashtable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0.效率低。
 |--HashMap:底层是哈希表数据结构,允许使用 null 值和 null 键,该集合是不同步的。将hashtable替代,jdk1.2.效率高。
 |--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给map集合中的键进行排序。

 

map集合的两种取出方式:
1,Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器。
 所有可以迭代方式取出所有的键,在根据get方法。获取每一个键对应的值。
  

 Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。


2,Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,
    而这个关系的数据类型就是:Map.Entry

    Entry其实就是Map中的一个static内部接口。
    为什么要定义在内部呢?
    因为只有有了Map集合,有了键值对,才会有键值的映射关系。
    关系属于Map集合中的一个内部事物。
    而且该事物在直接访问Map集合中的元素。

一、数据采集层:多源人脸数据获取 该层负责从不同设备 / 渠道采集人脸原始数据,为后续模型训练与识别提供基础样本,核心功能包括: 1. 多设备适配采集 实时摄像头采集: 调用计算机内置摄像头(或外接 USB 摄像头),通过OpenCV的VideoCapture接口实时捕获视频流,支持手动触发 “拍照”(按指定快捷键如Space)或自动定时采集(如每 2 秒采集 1 张),采集时自动框选人脸区域(通过Haar级联分类器初步定位),确保样本聚焦人脸。 支持采集参数配置:可设置采集分辨率(如 640×480、1280×720)、图像格式(JPG/PNG)、单用户采集数量(如默认采集 20 张,确保样本多样性),采集过程中实时显示 “已采集数量 / 目标数量”,避免样本不足。 本地图像 / 视频导入: 支持批量导入本地人脸图像文件(支持 JPG、PNG、BMP 格式),自动过滤非图像文件;导入视频文件(MP4、AVI 格式)时,可按 “固定帧间隔”(如每 10 帧提取 1 张图像)或 “手动选择帧” 提取人脸样本,适用于无实时摄像头场景。 数据集对接: 支持接入公开人脸数据集(如 LFW、ORL),通过预设脚本自动读取数据集目录结构(按 “用户 ID - 样本图像” 分类),快速构建训练样本库,无需手动采集,降低系统开发与测试成本。 2. 采集过程辅助功能 人脸有效性校验:采集时通过OpenCV的Haar级联分类器(或MTCNN轻量级模型)实时检测图像中是否包含人脸,若未检测到人脸(如遮挡、侧脸角度过大),则弹窗提示 “未识别到人脸,请调整姿态”,避免无效样本存入。 样本标签管理:采集时需为每个样本绑定 “用户标签”(如姓名、ID 号),支持手动输入标签或从 Excel 名单批量导入标签(按 “标签 - 采集数量” 对应),采集完成后自动按 “标签 - 序号” 命名文件(如 “张三
<think>我们正在处理一个前端问题:如何合并两个Map集合(一个大Map和一个小Map) 根据用户的问题,我们需要合并两个Map对象。在JavaScript中,Map是键值对的集合,我们可以使用多种方法来合并两个Map。 合并Map的基本思路: 1. 创建一个新的Map实例(或者也可以选择其中一个作为基础进行修改)。 2. 将第一个Map的所有键值对添加到新Map中。 3. 将第二个Map的所有键值对添加到新Map中。注意:如果两个Map有相同的键,则后添加的会覆盖先添加的。 在JavaScript中,我们可以使用以下方法: 方法1:使用循环 - 遍历第一个Map,将每个键值对添加到新Map。 - 遍历第二个Map,将每个键值对添加到新Map。 方法2:使用ES6的展开运算符(...)将Map转换为键值对数组,然后再合并数组,最后用这个数组创建新的Map。 - 注意:展开运算符可以用于将Map转换为数组(数组的元素是[key, value]数组),然后我们可以将两个数组合并,最后用合并后的数组创建新的Map。 具体步骤: 示例代码: let bigMap = new Map([['a', 1], ['b', 2]]); let smallMap = new Map([['c', 3], ['b', 4]]); // 注意:'b'键在两个Map中都存在 // 合并:后添加的smallMap的键会覆盖bigMap中相同的键 let mergedMap = new Map([...bigMap, ...smallMap]); // 结果:mergedMapMap(3) {"a" => 1, "b" => 4, "c" => 3} 但是,如果用户希望保留两个Map的所有数据,并且不覆盖,那么合并可能不是简单的覆盖。不过通常合并Map时,对于相同键的处理是覆盖,且后面的覆盖前面的。 如果用户有特殊需求,比如相同键的值进行合并(比如相加),那么需要另外处理。 根据问题,用户没有提到特殊处理,所以我们按照常规的覆盖处理。 因此,我们可以给出如下解决方案: 方案: 使用展开运算符是最简洁的方法。 代码示例: function mergeMaps(map1, map2) { return new Map([...map1, ...map2]); } 但是,如果用户的环境不支持ES6的展开运算符,我们可以使用循环: function mergeMaps(map1, map2) { let result = new Map(); for (let [key, value] of map1) { result.set(key, value); } for (let [key, value] of map2) { result.set(key, value); // 如果key在map1中已经存在,这里会被覆盖 } return result; } 注意:如果两个Map都很大,使用展开运算符可能创建中间数组,会占用较多内存。此时循环方法可能更节省内存(因为不需要中间数组),但实际性能差异可能不大。 根据用户的问题,我们只需要合并两个Map,所以给出上述方法即可。 相关问题: 1. 如何在前端合并多个Map对象? 2. 合并Map时,如果键相同,如何自定义合并逻辑(例如,将值相加而不是覆盖)? 3. 如何在不支持ES6的环境下合并Map? 4. 合并Map后,如何高效地遍历合并后的Map? 现在,我们按照要求生成回答。</think>### 前端合并 Map 集合的方法 在前端 JavaScript 中合并大 Map 和小 Map 集合,主要有以下两种高效方法: #### 方法 1:使用展开运算符(ES6+ 推荐) ```javascript const bigMap = new Map([['a', 1], ['b', 2]]); const smallMap = new Map([['c', 3], ['d', 4]]); // 合并逻辑(小集合覆盖大集合的重复键) const mergedMap = new Map([...bigMap, ...smallMap]); console.log(mergedMap); // 输出:Map(4) {'a' => 1, 'b' => 2, 'c' => 3, 'd' => 4} ``` **特点**: - 时间复杂度:$O(n+m)$ - 重复键处理:后添加的值覆盖先前的值(smallMap 优先级更高) - 适用场景:快速简单合并,ES6 环境 #### 方法 2:迭代添加(兼容性好) ```javascript function mergeMaps(bigMap, smallMap) { const result = new Map(bigMap); // 克隆大集合 for (let [key, value] of smallMap) { result.set(key, value); // 添加小集合(覆盖重复键) } return result; } // 使用示例 const merged = mergeMaps(bigMap, smallMap); ``` #### 自定义合并策略 如果需要特殊处理重复键(如值相加): ```javascript const customMerge = (bigMap, smallMap) => { const result = new Map(bigMap); for (let [key, val] of smallMap) { result.set(key, result.has(key) ? result.get(key) + val : val); } return result; }; // 示例:值相加 const mapA = new Map([['apples', 5]]); const mapB = new Map([['apples', 3], ['oranges', 2]]); console.log(customMerge(mapA, mapB)); // 输出:Map(2) {'apples' => 8, 'oranges' => 2} ``` #### 注意事项 1. **键的唯一性**:Map 的键具有唯一性,合并时重复键会被覆盖 2. **引用类型键**:对象作为键时需保持引用一致 3. **性能考量**:大集合优先克隆可减少操作次数 4. **不可变数据**:若需保留原集合,需先克隆 `new Map(originalMap)` > 当小集合数据需要优先生效时,采用 `new Map([...smallMap, ...bigMap])` 可反转优先级[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值