Java 用复合键将树状映射转换为平面映射

Java 用复合键将树状映射转换为平面映射,java,dictionary,mapping,logic,Java,Dictionary,Mapping,Logic,我试图用Java做一些事情,但是我被这个问题困住了,我真的不知道如何转换它。我尝试了for循环,但是我需要做很多for循环,我希望保持代码的整洁 我有一张像这样的地图 Map 1: A: Object B: Object C: Map 2 D: Object E: Object F: Map 3 G: Object (Here could be another map that could go really far,

我试图用Java做一些事情,但是我被这个问题困住了,我真的不知道如何转换它。我尝试了for循环,但是我需要做很多for循环,我希望保持代码的整洁

我有一张像这样的地图

Map 1:
  A: Object
  B: Object
  C: Map 2
     D: Object
     E: Object 
     F: Map 3
        G: Object
        (Here could be another map that could go really far, etc)
     H: Map 4
        I: Object
        J: Object
        (Here could also be more)\
     K: Object
     (Here could also be more)
请注意,这只是一个示例,贴图、键等的数量可能不同,键名称也可能不同。密钥名称不能包含点

C、 F和H是映射C包含D、E、F、H、K,映射F包含G等的映射

如何将其转换为一个类似以下的地图:

A: Object
B: Object
C.D: Object
C.E: Object
C.K: Object
C.F.G: Object
C.H.I: Object
C.H.J: Object
键的顺序无关紧要。

如下所示:

public Map<String, Object> convert (Map<String, Object> input, String key) {
    Map<String, Object> res = new HashMap<>();

    for (Entry<String, Object> e : input.entrySet()) {
        String newKey = key == "" ? e.getKey() : (key + "." + e.getKey());

        if (e.getValue() instanceof Map) {
            res.putAll(convert((Map) e.getValue(), newKey));  // recursive call
        } else {
            res.put(newKey, e.getValue());
        }
    }
    return res;
}
公共地图转换(地图输入,字符串键){
Map res=新的HashMap();
对于(条目e:input.entrySet()){
字符串newKey=key==“”?e.getKey():(key+“+e.getKey());
if(例如,映射的getValue()实例){
res.putAll(convert((Map)e.getValue(),newKey));//递归调用
}否则{
res.put(newKey,e.getValue());
}
}
返回res;
}
现在,您可以在输入映射上调用它:

Map<String, Object> converted = convert(input, "");
Map converted=convert(输入“”);

尝试一下类似的方法 假设你的地图是 地图

公共类对象映射器
{
地图子地图;
}
承认您的对象可以是字符串或贴图 假设您调用了这样一个对象的“路径” “1#2#4#5”

Map-someMap;
//分配地图或从某处加载地图
字符串searchPath=“1#2#4#5”;
String[]splitPath=searchPath.split(“#”);
字符串searchResult=null;
布尔resultFound=false;
布尔值resultWrongPlace=false;
Map mapToSearch=null;
对于(int i=0;i

我想说的是,沿着这些思路做的事情将实现递归连接键并将其放入映射中的技巧。。。你也可以发布你所做的事情……但我如何才能让它尽可能地深入呢?做很多for循环?你的意思是转换而不是在第5行分发吗?缺少返回声明感谢大家的审阅!更正了所有内容。很好,但在这里您查询树状图,而不是将其转换为平面图。是的,我认为Sasha Salauyou更优雅:)不幸的是,我用伪代码编写了这篇文章,比他的9代码行解决方案花费了我更多的时间,所以我没有注意到他在发布我的答案之前回答正确。。很抱歉收到垃圾邮件。。
    public class ObjectMapper
    {
    Map<Integer,Object> subMap;
    }
    Map<Integer, Object> someMap;

    //assign map or load it from somewhere
    String searchPath = "1#2#4#5";
    String[] splitPath = searchPath .split("#");
    String searchResult = null;
    boolean resultFound = false;
    boolean resultWrongPlace = false;

    Map<Integer, Object> mapToSearch = null;
    for(int i = 0; i < splitPath.length; i++)
    {
    if (resultFound == true)
      {
         resultWrongPlace = true;
         break;
      }
      if (i == 0)
      {
        mapToSearch = someMap;
      }
      Object currentObj = mapToSearch.get(splitPath[Integer.parseInt(splitPath[i])])
      if (currentObj instanceof String)
      {
         searchResult = (String) currentObj ;
         resultFound = true;
      }
      else if (currentObj instanceof ObjectMapper)
      {
         mapToSearch = (ObjectMapper) currentObj ;
         resultFound = false;
      }
    }
    if (resultFound == true && resultWrongPlace == true)
    {
    throw new Exception("result was found but the path that lead to a  result was different from the indended path!");
    }
    else if (resultFound == false)
    {
    throw new Exception("no result was found searching your expression path!");
    }