首页 > 解决方案 > 递归重构对象结构

问题描述

我有一个“HashMap> map”,它代表一个类似于目录树的对象树,其中父目录可以获取更多的子子目录等等。列表中的值也可以表示父级。

Map 包含例如以下键/值对:

map.put(obj1,  [obj2, obj3, obj4, obj5])
map.put(obj2,  [obj6, obj7, obj8, obj9])
map.put(obj6,  [obj10, obj11, obj12, obj13])
map.put(obj10, [])

如果我现在编码:

List children = map.get(obj1);
for(Object child : children){
   obj1.add(child);
}

我得到以下对象结构:

obj1--
      |
      obj2
      |
      obj3
      |
      obj3
      |
      obj5

这就是我的知识结束的地方,因为我编程的时间不长。我知道我有递归代码来获得正确的对象结构,例如:

obj1--
      |
      obj2--
      |     |
      |     obj6--
      |     |     |
      |     obj7  obj10 
      |     |     |
      |     obj8  obj11
      |     |     |
      |     obj9  obj12
      |
      |
      obj3
      |
      obj3
      |
      obj5

我正在努力实现一个递归工作代码,该代码在循环中重建对象结构。

如果有人可以带我走正确的路或者可以提供一个小例子,那将是非常好的。

提前感谢约翰

标签: java

解决方案


尝试这个:

import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class So53579861_recursively_reconstruct_object_structure {
    static String indent() {
        String string="";
        for(int i=0;i<4*indent;i++)
            string+=" ";
        return string;
    }
    static void visit(Map<Object,List<Object>> map,Object key) {
            System.out.println(indent()+key);
            List<Object> list=map.get(key);
            ++indent;
            if(list!=null)
            for(Object object:list)
                visit(map,object);
            --indent;
    }
    public static void main(String[] args) {
        visit(map,list.get(0));
    }
    static int indent;
    static List<Object> list=new ArrayList<>();
    static {
        for(int i=1;i<=13;i++)
            list.add(new Integer(i));
        System.out.println(list);
    }
    static Map<Object,List<Object>> map=new LinkedHashMap<>();
    static {
        List<Object> children=new ArrayList<>();
        for(int i=2;i<=5;i++)
            children.add(list.get(i-1));
        map.put(list.get(1-1),children);
        children=new ArrayList<>();
        for(int i=6;i<=9;i++)
            children.add(list.get(i-1));
        map.put(list.get(2-1),children);
        children=new ArrayList<>();
        for(int i=10;i<=13;i++)
            children.add(list.get(i-1));
        map.put(list.get(6-1),children);
        children=new ArrayList<>();
        map.put(list.get(10-1),children);
        children=new ArrayList<>();
        System.out.println(map);
    }
}

推荐阅读