如何匹配两个Map的键后缀并更新MapB的对应值?
实现方案
核心思路
因为明确不存在叶子节点冲突,整体时间复杂度可以做到O(n+m)(n是mapA大小,m是mapB大小),效率足够处理千级数据量:
- 先遍历
mapA,将每个key按/拆分取最后一段叶子节点作为新key,原value作为值,构建一个临时的叶子节点映射表 - 遍历
mapB,同样取每个key的叶子节点去临时映射表匹配,匹配到就直接更新mapB的对应value
关键工具方法
提取路径的叶子节点可以单独封装,避免重复代码:
private static String getLeafNode(String path) { // 兼容处理末尾带/的异常路径,比如/a/b/c/拆分最后会有空串,先去掉末尾斜杠 String trimmedPath = path.endsWith("/") ? path.substring(0, path.length() - 1) : path; String[] segments = trimmedPath.split("/"); return segments[segments.length - 1]; }
完整实现代码(Java)
import java.util.HashMap; import java.util.Map; public class MapMatchByLeaf { public static void updateMapBByLeafMatch(Map<String, String> mapA, Map<String, String> mapB) { // 第一步:构建mapA的叶子节点->value 临时映射 Map<String, String> leafToValueA = new HashMap<>(); for (Map.Entry<String, String> entry : mapA.entrySet()) { String leaf = getLeafNode(entry.getKey()); leafToValueA.put(leaf, entry.getValue()); } // 第二步:遍历mapB匹配更新 for (Map.Entry<String, String> entry : mapB.entrySet()) { String leafB = getLeafNode(entry.getKey()); if (leafToValueA.containsKey(leafB)) { // 匹配成功,更新mapB的value entry.setValue(leafToValueA.get(leafB)); } } } private static String getLeafNode(String path) { String trimmedPath = path.endsWith("/") ? path.substring(0, path.length() - 1) : path; String[] segments = trimmedPath.split("/"); return segments[segments.length - 1]; } // 测试用例 public static void main(String[] args) { Map<String, String> mapA = new HashMap<>(); mapA.put("/content/common/pqr", "/apps/content/data/abc"); Map<String, String> mapB = new HashMap<>(); mapB.put("/parsys/content/banner/pqr", "/apps/comment/data"); updateMapBByLeafMatch(mapA, mapB); // 输出验证结果为/apps/content/data/abc,符合预期 System.out.println(mapB.get("/parsys/content/banner/pqr")); } }
方案说明
- 额外做了末尾斜杠的兼容处理,避免路径格式不规范导致匹配失败
- 千级数据量下完全无性能压力,即使后续数据涨到十万级该方案也足够支撑
- 因为题目明确没有叶子节点冲突,所以不需要额外处理覆盖、冲突报错逻辑,代码简洁高效
内容的提问来源于stack exchange,提问作者Ronnie
相关产品推荐
相关产品推荐

