首页 > 解决方案 > 根据分隔符拆分字符串并根据分隔符的计数转换为 n 级 Pair of Pair

问题描述

有一个哈希图,下面是要求:


    Map<String, Object> objectmetainfo = new HashMap();
    objectmetainfo.put("userdetails.info.metadata.user.home.address.details", "address");
    objectmetainfo.put("userdetails.info.metadata.user.id", "id");
    objectmetainfo.put("userdetails.info.metadata.userSupervisor.id", "id");
    objectmetainfo.put("info.metadata.code", "code");
    objectmetainfo.put("zip", "zip");

  1. 获取hashmap的所有记录并迭代
  2. 根据分隔符拆分 Key 并将其转换为 Pair 或 Hashmap
  3. 每个字符串的分隔符数量会有所不同

下面应该是输出:

    E.g.: For "userdetails.info.metadata.user.home.address.details", "address", below output is required
         HashMap<userdetails, HashMap<info, HashMap<metadata, HashMap<user, HashMap<home, HashMap<address, Map<details, address>>>>>>>

    or Pair<String, Object> pair = new Pair("userdetails", new Pair("info", new Pair("metadata", new Pair("user", new Pair("home", new Pair("address", new Pair("details", "addressvalue"))))))); 


标签: java

解决方案


假设你的字符串不会太长,这会起作用,否则你会得到一个 StackOverflow 错误。l

我使用递归方法做到了这一点

  1. 用“.”分割键
  2. 将它们转换为列表迭代器
  3. 递归迭代此列表以创建嵌套映射
  4. 在递归结束时将值从objectmetainfo映射中。
  5. 创建一个空的结果映射并递归合并所有结果。

代码:

import java.util.*;
    public Map<String, Object> nestedMaps(Iterator<String> keys, String value) {
        if (keys.hasNext()) {
            String key = keys.next();
            Map<String, Object> nestMap = nestedMaps(keys, value);
            Map<String, Object> map = new HashMap<>();
            map.put(key, nestMap);
            if (Objects.equals(nestMap, null))
                map.put(key, value);
            return map;
        }
        return null;
    }
    public void mergeNested(Object srcObj, Object targetObj) {
        if (srcObj instanceof Map && targetObj instanceof Map) {
            Map<String, Object> srcMap = (Map<String, Object>) srcObj;
            Map<String, Object> targetMap = (Map<String, Object>) targetObj;
            for (String targetKey : targetMap.keySet()) {
                if (srcMap.containsKey(targetKey)) {
                    mergeNested(srcMap.get(targetKey), targetMap.get(targetKey));
                } else {
                    srcMap.putAll(targetMap);
                }
            }
        }

    }
    public Map<String, Object> objectmetainfo = new LinkedHashMap<>();
    objectmetainfo.put("userdetails.info.metadata.user.home.address.details", "addressValue");
    objectmetainfo.put("userdetails.info.metadata.user.id", "id");
    objectmetainfo.put("userdetails.info.metadata.userSupervisor.id", "id");
    objectmetainfo.put("info.metadata.code", "code");
    objectmetainfo.put("zip", "zip");

    public Map<String, Object> result = new HashMap<>();
    for (Map.Entry<String, Object> e : objectmetainfo.entrySet()) {
        List<String> keys = new ArrayList<>(Arrays.asList(e.getKey().split("\\.")));
        Map<String, Object> nestedMaps = nestedMaps(keys.iterator(), String.valueOf(e.getValue()));
        mergeNested(result, nestedMaps);
    }
    System.out.println(result);

我使用 toString 方法打印出所有的哈希图。 输出:

{
    zip= zip,
    userdetails= {
        info= {
            metadata= {
                userSupervisor= {
                    id= id
                },
                user= {
                    id= id,
                    home= {
                        address= {
                            details= addressValue
                        }
                    }
                }
            }
        }
    },
    info= {
        metadata= {
            code= code
        }
    }
}

推荐阅读