Java 扁平化口述的访谈Q

Java 扁平化口述的访谈Q,java,algorithm,Java,Algorithm,我有这个面试问题 编写一个函数来展平DICT数组 输入示例: 示例_input=[{a:{b:{c:{d:'e'}}},{a:{b:{c:{d:{e:'f'}}] 示例输出:[{a_b_c_d:'e'},{a_b_c_d_e:'f'}] 如何用java对输入进行建模 如何用Java解决这个问题 上面的输入可以映射到什么样的数据结构 class Node { String s; Node node; } 我尝试使用这个节点类,它将导致{Node:{Node:{Node:{s:'val

我有这个面试问题

编写一个函数来展平DICT数组 输入示例:
示例_input=
[{a:{b:{c:{d:'e'}}},{a:{b:{c:{d:{e:'f'}}]

示例输出:
[{a_b_c_d:'e'},{a_b_c_d_e:'f'}]

  • 如何用java对输入进行建模
  • 如何用Java解决这个问题 上面的输入可以映射到什么样的数据结构

    class Node {
       String s;
       Node node;
    }
    
    我尝试使用这个节点类,它将导致
    {Node:{Node:{Node:{s:'value'}
    而不是上面的
    {a:{b:{c:{d:'e'}}}}
    不要忘记,字典是一组成对的
    (键,值)
    ,具有键是唯一的不变量。因此,您可以将它们表示为:

    类Dict{
    列表对;
    }
    
    其中,

    类对{
    字符串键;
    Dict值;
    }
    
    或者,如果您想要更一般的概念:

    类对{
    T键;
    Dict值;
    }
    
    请注意,您可以将单个值表示为一对
    与值
    null
    Dict

    Dict展平(Dict-Dict){
    Dict new_Dict=new Dict();
    for(配对:dict.pairs){
    if(pair.value==null)
    新建目录对。添加(对);
    其他的
    new_dict.pairs.addAll(组合(pair.key,展平(pair.value));
    }
    }
    列表组合(字符串键,Dict值){//这里的值是一个扁平Dict
    列表对=新的ArrayList();
    for(对:value.pairs){
    pairs.add(新对(key+“”+Pair.key,Pair.value));
    }
    返回对;
    }
    
    您可以使用实现以下接口的两个类对输入进行建模:

    public interface Node {
      public Map<String, String> flatten(String prefix);
    }
    
    公共接口节点{
    公共地图展平(字符串前缀);
    }
    
    字符串节点:

    public class StringNode implements Node {
      private String nodeString;
      public StringNode(String s){
        this.nodeString = s;
      }
      public Map<String, String> flatten(String prefix){
        Map<String, String> map = new HashMap<String, String>();
        map.put(prefix, nodeString);
        return map;
      }
    }
    
    公共类StringNode实现节点{
    私有字符串节点限制;
    公共字符串节点(字符串s){
    this.nodeString=s;
    }
    公共地图展平(字符串前缀){
    Map Map=newhashmap();
    map.put(前缀、节点限制);
    返回图;
    }
    }
    
    字典节点:

    public class DictNode extends HashMap<String, Node> implements Node {
      public Map<String, String> flatten(String prefix){
        Map<String, String> map = new HashMap<String, String>();
        if ( prefix.length() > 0 ) prefix = prefix + "_";
        for ( String key : keySet() ) {
          map.putAll(get(key).flatten(prefix + key));
        }
        return map;
      }
    }
    
    公共类DictNode扩展HashMap实现节点{
    公共地图展平(字符串前缀){
    Map Map=newhashmap();
    如果(prefix.length()>0)prefix=prefix+“”;
    for(字符串键:keySet()){
    map.putAll(get(key).flatten(prefix+key));
    }
    返回图;
    }
    }
    
    现在,您只需要在节点上调用flatte方法
    使用空字符串参数值,您将返回扁平化字典。

    如果我错了,请纠正我。您必须将每个:{替换为{,并且所有连续的}都必须替换为单个}。@Dante这个想法是为了在一般情况下工作。例如,这不适用于
    {a:{b:c,d:e}
    因为在这种情况下,你应该有
    {a_b:c,a_d:e}
    。他给出的例子不具有代表性。