Map中处理指定key对应value值【key可以为A.B.C】

本文介绍如何在Map中操作具有层级结构的key(如A.B.C),包括获取、更新和删除这些key对应的value。内容涵盖递归方法和Java 8的流处理技巧。
package com.cwq.demo01;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/** 
 * @author Carpoor  
 * @date 2021年4月7日 
 */
public class Demo03 {
	
	public static Set<String> set = new HashSet<>();
	
	static {
		set.add("String");
		set.add("Integer");
		set.add("Double");
//		set.add("");
	}
	
	public static void main(String[] args) {
		
		List<String> xxx = new ArrayList<>();
		xxx.add("X.D");
		xxx.add("X.E");
		xxx.add("A.B.C");
		xxx.add("amount");
//		String[] keys = "A.B.C".split("\\.");
		
		Map<String, Object> map = new HashMap<>();
		
		map.put("amount", "6666");
		Map<String, Object> map1 = new HashMap<>();
		map1.put("amount", "7777");
		map.put("loan", map1);
		
		Map<String, Object> C = new HashMap<>();
		C.put("C", "Cc");
		Map<String, Object> A = new HashMap<>();
		A.put("B", C);
		map.put("A", A);
		
//		Map<String, Object> C = new HashMap<>();
//		C.put("C", "Cc");
//		Map<String, Object> A = new HashMap<>();
//		A.put("B", C);
//		map.put("A", C);
		
		Map<String, Object> D = new HashMap<>();
		D.put("D", "DD");
		D.put("G", "GG");
		Map<String, Object> E = new HashMap<>();
		E.put("E", "EE");
		E.put("F", "FF");
		
		List<Map<String, Object>> list = new ArrayList<>();
		list.add(D);
		list.add(E);
		
//		map.put("D", D);
		map.put("X", list);
		
		
		System.out.println(map);
		for (String str : xxx) {
			String[] keys = str.split("\\.");
			
			test(map, Arrays.asList(keys), 0, keys.length-1, (Map<String, Object> content, String key)->{
				content.put(key, content.get(key) + "处理了");
				System.out.println("------------------key:"+key);
			});
		}
		System.out.println(map);
		
	}
	
	public static void test(Map<String, Object> content, List<String> keys, Integer index, Integer length, FileProc fileProc) {
		
		Object object = content.get(keys.get(index));
		if (object == null) {
			return;
		}
		if (set.contains(object.getClass().getSimpleName())) {
			if (index == length) {
				fileProc.proc(content, keys.get(index));
			}
			else {
				System.out.println("不允许处理------------------false");
			}
		}
		else if (object instanceof List) {
			List list = (List)object;
			for (Object obj : list) {
				if (obj instanceof Map) {
					Map<String, Object> map = (Map)obj;
					test(map, keys, index+1, length, fileProc);
				}
			}
		}
		else if (object instanceof Map) {
			Map<String, Object> map = (Map)object;
			test(map, keys, index+1, length, fileProc);
		}
	}
	
	public interface FileProc{
		
		public void proc(Map<String, Object> content, String key);
		
	}

}

<think> 我们已经在之前的对话中详细解释了Map的set方法。现在用户的问题是:如何在JavaScript中改变Map对象里指定key对应value? 答案其实很简单:使用Map.prototype.set()方法。因为set方法在键已存在时会更新对应。 但是为了详细解答,我们可以这样组织: 1. 明确回答:使用set方法,传入已有的key和新的value。 2. 解释原理:Map中每个key是唯一的,set方法会替换同一个key的旧。 3. 提供代码示例。 4. 注意点:确保key的引用(如果是对象作为键,必须是同一个对象引用)。 同时,参考用户提供的引用: 引用[1]中展示了如何遍历Map(注意:该代码是使用for...in遍历,但这是不正确的,因为Map实例不应该用for...in遍历,而应该用for...of或Map.prototype.forEach)。不过它展示了通过key获取value,然后可以修改?但实际上,在遍历过程中修改Map是可以的(但通常我们不建议在遍历时修改,除非你明确知道在做什么,因为修改不会影响遍历,但修改结构(如删除或添加)可能会导致问题)。 但是用户的问题不是遍历修改,而是修改指定key。因此我们不需要遍历。 引用[3]中展示了通过map.keySet()遍历key,然后通过map.get(key)获取。这同样可以用于修改,但同样,这里我们不需要遍历。 因此,我们直接给出答案。 另外,用户引用了多个来源,其中引用[5]展示了将Map转换为数组再处理,但这不是必需的。 步骤: 1. 创建一个Map实例。 2. 使用set方法添加键对。 3. 当需要修改某个key时,再次使用set方法,传入相同的key和新的value。 示例: 假设我们有一个Map,其中包含一些键对,我们想修改其中一个键对应。 注意:如果键是对象,必须是同一个对象的引用,否则会被视为不同的键。 代码示例: ```javascript // 创建一个Map实例 const map = new Map(); // 添加初始 map.set('name', 'Alice'); map.set('age', 25); // 修改'name'对应 map.set('name', 'Bob'); // 现在'name'对应变为'Bob' // 如果键是对象 const keyObj = { id: 1 }; map.set(keyObj, 'Initial value'); // 修改对象键对应,必须使用同一个对象引用 map.set(keyObj, 'New value'); // 修改成功 // 错误方式:创建一个内容相同但不同引用的对象作为键 const anotherObj = { id: 1 }; map.set(anotherObj, 'This is a different key'); // 因为anotherObj和keyObj不是同一个对象,所以这里添加了一个新的键对,而不是修改原有的。 console.log(map.get(keyObj)); // 输出 'New value' console.log(map.get(anotherObj)); // 输出 'This is a different key' ``` 因此,修改Map指定keyvalue,只需调用set方法,前提是你能拿到那个key的正确引用。 最后,生成相关问题: 1. 如何删除Map中的某个键对? 2. 如何判断Map中是否存在某个键? 3. 在JavaScript中,Map对象与普通对象的键有什么区别? 4. 如何使用对象作为Map的键?需要注意什么? 5. Map的键对数量如何获取? 注意:在回答中,我们引用了用户提供的引用标记,但这里我们的答案并不直接依赖这些引用,所以我们可以不添加引用标记。但如果我们提到遍历,可以引用[1]和[3],不过这里我们没有重点使用遍历。因此,我们可以不添加引用标记,或者只在提到遍历时引用。 但是,用户提到“参考站内引用”,所以我们在适当的地方可以引用。 例如,在提到遍历Map的方法时,我们可以引用[1]和[3](虽然我们这里没有用到遍历,但如果我们扩展一下说“如果你不知道具体的键,需要遍历查找,可以参考引用[1]和[3]中的遍历方法”,但用户的问题很明确是“指定key”,所以不需要遍历。因此,我们主要回答直接修改,不涉及遍历。 所以,我们这样写: 在JavaScript中,要修改Map对象中指定键(key对应value),直接使用`Map.prototype.set()`方法即可。因为当键已经存在于Map中时,`set()`方法会更新该键对应。需要注意的是,如果键是一个对象,必须使用相同的对象引用才能正确更新,否则会创建一个新的键对[^4]。 然后给出上面的代码示例。 生成相关问题放在最后。 </think> ### JavaScript中修改Map指定对应 在JavaScript中,要修改Map对象中指定键(key对应value),直接使用`Map.prototype.set()`方法即可。因为当键已经存在于Map中时,`set()`方法会更新该键对应。以下是详细说明和操作步骤: #### 1. **核心原理** - Map中的键是唯一的,每个键最多对应一个 - **重复调用`set()`方法传入相同键时**: - 如果键不存在 → 添加新键对 - 如果键已存在 → 更新对应(原有被覆盖) - 操作时间复杂度为常数级$O(1)$,性能高效[^1] #### 2. **操作步骤** ```javascript // 创建Map并添加初始 const userMap = new Map(); userMap.set("id", 1001); userMap.set("name", "Alice"); userMap.set("role", "admin"); // 修改指定键的(键"name"已存在) userMap.set("name", "Bob"); // 更新 // 链式调用修改多个 userMap.set("role", "editor").set("status", "active"); console.log(userMap.get("name")); // 输出: "Bob" console.log(userMap.get("role")); // 输出: "editor" ``` #### 3. **对象键的特殊处理** 当键是对象时,必须使用**相同引用**才能正确更新: ```javascript const addressKey = { type: "primary" }; userMap.set(addressKey, "Beijing"); // ✅ 正确修改(使用相同对象引用) addressKey.city = "Shanghai"; // 修改属性不影响键引用 userMap.set(addressKey, "Shanghai"); // 正确更新 // ❌ 错误修改(使用新对象) const newKey = { type: "primary" }; userMap.set(newKey, "Guangzhou"); // 会创建新键对,而非更新 ``` #### 4. **批量修改技巧** 结合遍历实现批量修改: ```javascript // 示例:将所有数类型加倍 const dataMap = new Map([ ["a", 10], ["b", 20], ["c", "text"] ]); for (let [key, value] of dataMap) { if (typeof value === "number") { dataMap.set(key, value * 2); // 修改符合条件的 } } console.log([...dataMap]); // 输出: [["a", 20], ["b", 40], ["c", "text"]] ``` #### 5. **注意事项** 1. **键的相等性判断**:Map使用`SameValueZero`算法判断键是否相等 - `NaN`与`NaN`视为相等 - 对象需相同引用才被视为同一键 2. **不可变键原则**:对象作为键时,修改对象属性**不会触发**Map的更新 3. **性能提示**:频繁更新时优先使用Map而非Object,因Map对增删操作有优化[^4] > **关键总结**:只需在已存在键上再次调用`set(key, newValue)`即可修改,这是Map的核心特性之一[^1][^4]。 --- ### 常见问题场景解决方案 | 场景 | 解决方案 | 代码示例 | |------|----------|----------| | 条件更新 | 遍历+类型判断 | `if(typeof value==='string') map.set(key, value.trim())` | | 对象键更新 | 保持相同引用 | `map.set(objKey, newValue)` | | 批量更新 | 结合数组方法 | `[...map].forEach(([k,v]) => map.set(k, v*2))` | | 错误处理 | 先检查键是否存在 | `if(map.has(key)) map.set(key, newVal)` |
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值